H5唤起支付宝钱包支付 即时到账接口支持DSA、RSA、MD5三种签名方式,请根据实际业务需求选择合适的签名方式 其中 md5 只需要一个秘钥 key 不需要上传公钥什么的 app_pay=Y:尝试唤起支付宝客户端进行支付,若用户未安装支付宝,则继续使用wap收银台进行支付
http://wappaygw.alipay.com/service/rest.htm?_input_charset=utf-8&format=xml&partner=2088011508184288&req_data=%3Cauth_and_execute_req%3E%3Crequest_token%3E20170630f05785795d5aac3fb37346d09254a27a%3C%2Frequest_token%3E%3C%2Fauth_and_execute_req%3E&sec_id=MD5&service=alipay.wap.auth.authAndExecute&v=2.0&sign=315e981743e013fc74a146ebacac8888&app_pay=Y
wap 支付取消跳转到支付宝 APP 支付,点继续支付的时候提示 交易订单处理失败,请稍后再试(ALI64)
ali64的含义是签名错误,请检查
1. 公私钥正确性
2.检查自己的公钥是否正确上传;
3. 编码格式问题
4. sign有没有做encode或者多做了一次encode
更多产品及接口相关内容请移步 APP支付产品及接口文档
同时可以参考支付宝的 签名专区,进一步了解支付宝加签验签规则及方法。
这个老版本接口现在已经下架了 因为这个接口之前签约有权限的还能继续使用,但是支付宝这边不对接口进行维护更新了
手机网站支付接口 http://aopsdkdownload.cn-hangzhou.alipay-pub.aliyun-inc.com/demo/alipaywapdirect.zip
无封号风险破解百度网盘下载限速、大文件下载限制等问题(值得收藏)](http://www.gioov.com/index.php/884) 百度网盘直接下载助手: Regex Tester:http://www.regexpal.com/(英文工具站点) RegexPal:http://regexpal.isbadguy.com/(汉化版RegexPal,推荐) https://regex101.com/ 分享一段代码,却是网页前端设计必备小技巧 *{outline: 1px solid red;} MEGA一家拥护人权宣言的国外良心网盘 一个设置,教你远离百度搜索引擎广告 安全课程 ctf安全工具 使用ZeroNet搭建P2P全球网站 项目地址:https://github.com/hellozeronet/zeronet 重温PHP手册 – 生成器
function xrange($start, $limit, $step = 1) {
if ($start < $limit) {
if ($step <= 0) {
throw new LogicException('Step must be +ve');
}
for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
} else {
if ($step >= 0) {
throw new LogicException('Step must be -ve');
}
for ($i = $start; $i >= $limit; $i += $step) {
yield $i;
}
}
}
将 range() 实现为生成器,主要是使用 yield 替代 return (并且一个生成器也不能 return,这会造成编译错误 如果 yield 后未跟变量,则返回 NULL 值
function getLines($file) {
$f = fopen($file, 'r');
try {
while ($line = fgets($f)) {
yield $line;
}
} finally {
fclose($f); // 结束时关闭资源
}
}
foreach (getLines("file.txt") as $n => $line) {
if ($n > 5) break;
echo $line;
}
非限定名称: 例如 $a = new foo();,如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。
限定名称: 例如 $a = new subnamespace\foo();,如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo。
完全限定名称: 例如$a = new \currentnamespace\foo();,则总是被解析为代码中的文字名(literal name)currentnamespace\foo。
namespace NS;
define(__NAMESPACE__ .'\foo','111');
define('foo','222');
echo foo; // 111.
echo \foo; // 222.
echo \NS\foo // 111.
echo NS\foo // fatal error. assumes \NS\NS\foo.
在已有的word文档,或者模板中,插入一个表格
$table = $section->addTable();
$cellStyle = array( 'bgColor' => 'ffffff','borderColor' => '000000','cellMargin' => 50,'borderSize' => 6);
//$table = $section->addTable();
$table->addRow(300);
// Add cells
$table->addCell(2000,$cellStyle)->addText('Col 1');
$table->addCell(2000,$cellStyle)->addText('Col 2');
$table->addCell(2000,$cellStyle)->addText('Col 3');
$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007');
$sTableText = $objWriter->getWriterPart('document')->getObjectAsText($table);
数据导出分页
function getWebinarShare($id)
{
$str = "用户ID,游客ID,参会ID,用户昵称,有效分享总数,微信分享总数,微博分享总数,QQ分享总数\n";
$filename = 'webinar_share_stat'.$id.'_'.date('YmdHis').'.csv'; //设置文件名
header("Content-type:text/csv");
header("Content-Disposition:attachment;filename=".$filename);
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Expires:0');
header('Pragma:public');
$count = WebinarShareStat::where('webinar_id', $id)->count();
if($count <= 0){
$str = iconv('utf-8','GBK//IGNORE',$str);
echo $str;
exit;
}
$take = 1000;
$s = floor($count/$take);
for ($i=0; $i<=$s; $i++) {
if($i>0) $str = '';
$skip = $take * $i;
$webinarShareStatObj = WebinarShareStat::where('webinar_id', $id)->skip($skip)->take($take)->get();
foreach ($webinarShareStatObj as $list) {
$data['user_id'] = $userIsJoin->user_id;
$data['visit_id'] = $userIsJoin->visit_id;
$data['join_id'] = $userIsJoin->id;
$data['nick_name'] = $userIsJoin->name;
$data['total'] = $list['num'];
$data['weixin_total'] = $list['weixin'];
$data['weibo_total'] = $list['weibo'];
$data['qq_total'] = $list['qq'];
$str .= implode(',', $data)."\n";;
}
}
//删除临时变量
$str = iconv('utf-8','GBK//IGNORE',$str);
echo $str;
unset($str);
ob_flush();
flush();
sleep(1);
}
}
$this->execute("UPDATE {table} SET `duration` = TIMESTAMPDIFF(MINUTE,`t_start`,'{$data['t_end']}') WHERE `id` = '{$data['id']}'");
phpquery querycc.list pyquery 利用Content-disposition实现无刷新下载图片文件
无刷新下载 rar 之类的文件很好实现:
通过 meta 标签: <meta http-equiv="refresh" content="url=http://down.load/file.rar">;
通过 Javascript 重定向: window.location.assign("http://down.load/file.rar");
通过 Javascript 构建隐藏的 iframe 并设置 src $(body).append('<iframe style="display:none;" src="http://down.load/file.rar"')。
header('Content-Disposition: attachment; filename=girl.png');
// 禁止浏览器缓存,否则IE下可能会失效
header("Pragma: No-cache");
header("Cache-Control: No-cache");
header("Expires: 0");
// 简单的返回文件
echo file_get_contents('http://localhost/girl.png');
SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)
如果要找出在AA(左边的表)中有,而在BB(右边的表)中没有的数据项,可以使用如下的SQL语句
SELECT * FROM A LEFT OUTER JOIN B ON AA = BB WHERE BB is NULL
如果想要取得所有的元素项,则可以使用FULL JOIN:
SELECT * FROM A FULL JOIN B ON AA = BB
AA BB
-------- --------
Item 1 <-----+
Item 2 |
Item 3 Item 3 |
Item 4 Item 4 |
Item 5 +--- empty holes are NULL's
Item 6 |
^ |
| |
+---------------------+INNER JOIN将只会返回相匹配的元素项,即不会返回结果为NULL的数据项。
function inverse($x) {
if (!$x) {
throw new Exception('Division by zero.');
}
else return 1/$x;
}
try {
echo inverse(5); // 0.2
echo inverse(0); // Caught exception: Division by zero.
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
// Continue execution
echo 'Hello World';
TCP的构成与调优_《Web性能权威指南》读书笔记 php 易错知识盘点
/* 定义变量区分大小写*/
$abc=100;
$Abc=200;
echo $abc.'|'.$Abc; //输出100|200
/*定义函数不区分大小写 下面写法系统会报错:Fatal error: Cannot redeclare Abc() */
function abc(){
echo 'abc';
}
function Abc(){
echo "Abc";
}
https://zhuanlan.zhihu.com/p/25088168
$arr = [1,2,3];
foreach($arr as &$v) {
//nothing todo.
}
foreach($arr as $v) {
//nothing todo.
}
var_export($arr);
//output:array(0=>1,1=>2,2=>2),你的答案对了吗?为什么
//第一个foreach用引用赋值的方式将数组的值依次赋给了$v。
$arr = array('a', 'b', 'c');
foreach($arr as &$v) {}
var_dump($v);
//此时的$v的值为c,是引用赋值,$v指向了字符串c的地址空间。
//第二个foreach是以拷贝赋值的方式将数组的值依次赋值给了$v。
//由于目前$v指向了c的地址空间,那么改变$v的值即改变了c所占地址空间的值。
$arr = array('a', 'b', 'c');
foreach($arr as &$v) {}
foreach($arr as $v) {
var_dump($arr); break;
}
//第一次赋值将a赋值到了$v,原有c所占的地址空间的值变为了a,此时数组就是array('a', 'b', 'a')。
//以此类推第一次赋值c->a,第二次赋值即a->b,第三次赋值即b->b,
//所以最终结果为array('a', 'b', 'b')。
https://segmentfault.com/a/1190000004340634
// $a = "hello";
// $b = &$a;
// unset($b);
// echo $a;
//输出 hello
// var_dump(empty(false));
输出 true
final class demo
{
public static $count = 0;
function __construct()
{
self::$count++;
}
}
$a = new demo();
$b = new demo();
$c = new demo();
echo demo::$count;
输入 3
static属性常驻内存,不会被立刻回收
class A{
public $num = 100;
}
$a = new A();
$b = $a;
$b->num = 200;
echo $a->num;
输出:200
在php5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。 当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。
对象的复制是通过引用来实现的,$a=new A();$b=$a;相当于$a=new A();$b=&$a;
在一个对象的方法中,$this 永远是调用它的对象的引用。
当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说下面两者是相同的:
// 两种定义是等价的
global $var;
$val =& GLOBALS['var'];
unset($var) 不会 unset 全局变量。
当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了
$a = 1;
$b =& $a;
unset($a);
echo $b; // 1
返回新对象时,默认是返回引用,因此可以达到链式操作的效果
class Foo {
public function sayHi() {
echo 'Hi, ';
return $this;
}
public function sayHello() {
echo 'Hello';
return $this;
}
}
function test() {
return new Foo();
}
test()->sayHi()->sayHello();
可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。注意在函数调用时没有引用符号——只有函数定义中有。
function foo(&$var)
{
$var++;
}
如果传递一个对象,函数内修改也会修改该对象
$a=5;
foo($a);
$a = 1;
$c = 2;
$b =& $a; // $b points to 1
$a =& $c; // $a points now to 2, but $b still to 1;
echo $a, " ", $b; // Output: 2 1
$a = 0123; // 八进制数 (等于十进制 83)
$a = 0x1A; // 十六进制数 (等于十进制 26)
当从浮点数转换成整数时,将向下取整(去掉小数位)-> 决不要将未知的分数强制转换为 integer!
echo (int) ( (0.1+0.7) * 10 ); // 显示 7!
$i = 6887129852;
echo "i=$i\n";
echo "i%36=".($i%36)."\n"; // -24, wrong
echo "alternative i%36=".($i-floor($i/36)*36)."\n"; // 20, right
永远不要相信浮点数结果精确到了最后一位,也永远不要直接比较两个浮点数是否相等
要测试浮点数是否相等,要使用一个仅比该数值大一丁点的最小误差值。该值也被称为机器极小值(epsilon)或最小单元取整数,是计算中所能接受的最小的差别值$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001; # 可以比较小数点后五位的浮点数
if(abs($a-$b) < $epsilon) {
echo "true";
}
$name = 'Star';
$str = <<<EOD
My name is $name,
spanning multiple lines using heredoc syntax.
EOD;
echo $str;
// 注意作为参数传递时,结束标识符后不能有任何内容,包括分号。
foo(<<<END
abcd
END
);
// 有效的表示
echo "This is $great";
echo "This is {$great}";
echo "This is ${great}";
// 需注意的是数组,只能用 花括号 才能正确解析带引号的键名。
echo "resut: $arr[0]"; // 有效
echo "result: $array['result']"; // 出错
echo "result: {$array['result']}"; // 有效
echo "result: ".$arr['result']; // 有效
function getArray() {
return array(1, 2, 3);
}
// on PHP 5.4
$secondElement = getArray()[1];
// previously
$tmp = getArray();
$secondElement = $tmp[1];
// or
list(, $secondElement) = getArray();
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001; # 可以比较小数点后五位的浮点数
if(abs($a-$b) < $epsilon) {
echo "true";
}
$name = 'Star';
$str = <<<EOD
My name is $name,
spanning multiple lines using heredoc syntax.
EOD;
echo $str;
// 注意作为参数传递时,结束标识符后不能有任何内容,包括分号。
foo(<<<END
abcd
END
);
// 有效的表示
echo "This is $great";
echo "This is {$great}";
echo "This is ${great}";
// 需注意的是数组,只能用 花括号 才能正确解析带引号的键名。
echo "resut: $arr[0]"; // 有效
echo "result: $array['result']"; // 出错
echo "result: {$array['result']}"; // 有效
echo "result: ".$arr['result']; // 有效
function getArray() {
return array(1, 2, 3);
}
// on PHP 5.4
$secondElement = getArray()[1];
// previously
$tmp = getArray();
$secondElement = $tmp[1];
// or
list(, $secondElement) = getArray();
class MyClass {
public $property = 'Hello World!';
public function MyMethod()
{
call_user_func(array($this, 'myCallbackMethod'));
}
public function MyCallbackMethod()
{
echo $this->property;
}
}
// 回调函数
function my_callback_function() {
echo 'hello world!';
}
// 回调方法
class MyClass {
static function myCallbackMethod() {
echo 'Hello World!';
}
}
// Type 1: 简单的回调
call_user_func('my_callback_function');
// Type 2: 静态回调方法
call_user_func(array('MyClass', 'myCallbackMethod'));
// Type 3: 对象回调方法
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
// Type 4: 静态回调方法 (As of PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');
$a = array();
$a == null <== return true
$a === null <== return false
is_null($a) <== return false
$obj = (object) 'ciao';
echo $obj->scalar; // outputs 'ciao'
$arrObj = (object) array('a' => 'aa', 'b'=> 'bb');
echo $arrObj->a; // outpus 'aa'
echo $arrObj->{'a'} // outpus 'aa'
$arrObj = (object) array('aa', 'bb');
var_dump($arrObj); // object(stdClass)#1 (2) { [0]=> string(2) "aa" [1]=> string(2) "bb" }
echo $arrObj->{0}; // Notice: Undefined property: stdClass::$0 in... 将数组转换为Object,务必指定键名,且不能使用数字型,否则无法获取(即使能正确转换)。注意语法为 $arrObj->{‘key’}
若将NULL值转换为数组,则会返回空数组,这点特性可以用在一些地方。例如需要合并两个数组,但其中一个数组可能为NULL
// $values可能为NULL.
$combined = array_merge((array)$values, $other);
如果在$_POST数组(从form中传递过来)中使用字符串作为键名,键名中的小数点、空格会转换为下划线。程序中操作$_POST数组,则不会有这个情况defined('CONSTANT') or define('CONSTANT', 'SomeDefaultValue');
define('MAX_VALUE', 1);
echo MAX_VALUE; // 输出 1
echo constant('MAX_VALUE'); // 也可通过函数获取
静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
/* 多次执行 test(), $a 可以累加 */
function test()
{
static $a = 0;
echo $a;
$a++;
}
静态变量复制时不能使用表达式。如 static $int = 1+2; 是错误的。
$a = 1;
function Test()
{
global $a;
echo $a;
}
Test();
$a = 1;
function Test()
{
echo $GLOBALS['a'];
}
使用 $GLOBALS 数组,$GLOBALS 是超全局变量,即在一个脚本中的全部作用域中都可用,而无需执行 global $variable,如 $_SERVER 变量。
Test();
逻辑运算符总是返回布尔值
$a = 0 || 'avacado';
print "A: $a\n"; // 输出 1(布尔值true)
and 和 or 的优先级比较低,低于 &&、||、=
$e = false || true; // 判断 (false || true) 是否成立
$f = false or true; // 先执行赋值 $f = false ,再判断 $f or true 是否成立
var_dump($e, $f); // true, false
$g = true && false; // 判断 (true && false) 是否成立
$h = true and false; // 先执行赋值 $f = false ,再判断 $f and true 是否成立
var_dump($g, $h); // false, true
($a = $_GET['var']) || ($a = 'a default');
defined('VALUE') or define('VALUE', 'v');
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "At 5<br />\n";
break 1; /* 只退出 switch. */
case 10:
echo "At 10; quitting<br />\n";
break 2; /* 退出 switch 和 while 循环 */
default:
break;
}
}
注意生成对象是自动传递引用,所以如果匿名函数传递的是对象,要特别注意,应传递引用:
Hadoop安装配置简略教程 &符号引用传递会对运算结果有什么影响?
$b = &$a;
这个操作,可以认为,$a和$b都指向原本$a变量所在的那块内存(为了方便后面解释,称为内存X),也就是说,后面任何对于$a或者$b的操作,都是在直接对这块内存里的值进行修改。
所以加上这一行之后的运行流程:
前面步骤省略,初始a为1
$c = (++$a) + (++$a)的两次++$a都是在操作内存X,也就是把内存X里的值自增了两次,所以,在运算$c的值的时候,取的是这个内存里数的值,也就是自增了两次之后的内存X里的值。所以,是3 + 3 = 6(运算$c时候,内存X里存的值是3)。
这个跟PHP的底层实现有关,说起来很长,推荐看一下github上同样问题的解析
一个PHP bug引发的探索
https://github.com/xurenlu/phplearn/blob/master/%E4%B8%80%E4%B8%AAPHP%20bug%E5%BC%95%E5%8F%91%E7%9A%84%E6%8E%A2%E7%B4%A2.md
权限管理,通常使用 RBAC (Role-Based Access Control) 模式。https://segmentfault.com/q/1010000009856212
R : role 代表角色,主要给各个权限分组,例如管理员,编辑,审核员等等。
具体思路:
给程序的每个模块,可以考虑是每个 Controller 甚至细化到每个控制器的function。给这些模块取一个名字,记到数据库里,同时在程序里标识上。
然后把这个模块和角色(role)关联起来,记到一张表里,比如说编辑,可能操作的模块是写文章,编辑文章等等。
最后把 user 和 角色关联起来。
这样,当某个用户要执行某个操作(访问某个action的时候),可以把当前用户处在哪个角色读出来。然后根据角色信息去角色模块对应表里找,是否有当前操作模块的记录,有的话说明有授权。
以上是基本思路,不仅是CI,其它的框架也能用
function mb_str_split($str)
{
return preg_split('/(?<!^)(?!$)/u' , $str);
}$string = '中国共产党万岁!aaaaa';
var_dump(preg_split('//u', $string, 0, PREG_SPLIT_NO_EMPTY));
preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
bash变量赋值时等号两边不能有空格,应写成:
dir=/webserver/test/
写明文档类型为 XML
header("Content-Type:text/xml; charset=UTF-8");
$str = '[["10","荔枝好吃"],["11","葡萄好吃"],["18","菠萝好吃"]]';// 字符串
$arr = array_reduce(json_decode($str,true),function($c,$v){$c[$v[0]]=$v[1];return $c;},[]);
var_dump($arr); // 对应数组
/*
array(3) {
[10]=>
string(12) "荔枝好吃"
[11]=>
string(12) "葡萄好吃"
[18]=>
string(12) "菠萝好吃"
}
*/$arr = [["10","荔枝好吃"],["11","葡萄好吃"],["18","菠萝好吃"]];
echo "<pre>";
print_r(array_column($arr, 1, 0));
var_dump(json_decode('[["10","荔枝好吃"],["11","葡萄好吃"],["18","菠萝好吃"]]'));
PHP 如何判断数组里的键值是否使用相同键名,并输出当前相同键名的键值?https://segmentfault.com/q/1010000009909093
$target = [50, 59, 65];
foreach($arr as $index => $value) { // 遍历整个$arr
$keys = array_keys($value); // 获取对应项的键值
$check = true; // 默认为真,如果下面遍历中出现一个假值则为假,否则真值表示所有的目标键名都在此项中
foreach($target as $target_key) { // 遍历所有的目标键名
if(!in_array($target_key, $keys)) { // 如果发现目标键名不在当前项键名$keys中,则设置$check为假值,并直接跳出
$check = false;
break;
}
}
if($check) { // 通过了键名检测,那么这就是要找的项,输出
print_r($index);
print_r($value);
}
}
Redis下批量删除特定pattern的keyshttp://www.revotu.com/redis-delete-multiple-keys-by-pattern.html
redis-cli -h [host] -p [port] -n [db] KEYS "pattern" | xargs redis-cli -h [host] -p [port] -n [db] DEL
有用的在线工具http://www.revotu.com/useful-online-tools.html PDF转换(Image、Word、Excel等)工具https://www.freepdfconvert.com/
在线正则表达式测试http://www.rubular.com/ 在线文件对比 https://www.diffchecker.com/ 各种编程语言在线编译:ideone
for($n = 1; $n < 100; $n++) {
echo chr(3); // 输出文本结束控制字符,这样可以清除之前输出的文本内容
echo chr(8); // 将前一个控制字符删掉,避免在控制台留下控制字符的标记
echo "inserting row $n\r";
sleep(1); // 延时一秒是为了看清楚文字变化
}
phpunit单元测试问题 php 的 opcache 和最近的 php jit 有什么区别 Windows上如果PHP连接MySQL的host使用了localhost,改成127.0.0.1试试.因为Win7上my.ini里配置了bind-address=127.0.0.1,PHP用localhost连接会被卡1秒. 源代码(人认识)->字节码(解释器认识)->机器码(硬件认识) 来看下PHP的执行流程,假设有个a.php文件,不启用opacache的流程如下: a.php->经过zend编译->opcode->PHP解释器->机器码 启用opacache的流程如下 a.php->查找opacache缓存,如果没有则进行zend编译为opcode并缓存->opacode->PHP解释器->机器码 启用jit的流程如下 a.php->编译->机器码 以后都只执行机器码,不编译,效率上高了很多 php 记住密码登陆如何做安全 首先,登录成功了之后,随机生成一个MD5的hash值token(32位或者64位); 然后,把这个token存入当前用户的表,然后给这个用户增加一个token字段和last_login_time字段; 把这个token返回让浏览器的cookie存储,设置一个最长时常,比如30天; 这三个过程的主要作用就是,last_login_time可以检查过期时间,过期时间到了之后,就更新这个token,另外,只要用户通过这个token登录成功就进行更新token,这样就能尽可能的保证安全。
每次用户访问网站的时候,检查cookie里是否有token,如果有token就去数据库查询数据,如果查到就直接登录成功了,也就省去了用户名和密码验证登录的阶段。
整套思想是这样,你也可以让前端把token存入localstorage 504 Gateway Time-out之后,代码还会继续执行吗? nginx 504 之后,php 还有可能会执行一段时间。具体看 nginx 的超时设置 和 php 的超时设置。 代码不会继续执行了,就是因为代码得不到请求,所以才会出现504Gateway Time-out PHP的链式调用
class Api
{
public function auth(){
//quiet a few
var_dump(222);
}
public function render(){
//quiet a few
}
}
class Site{
static private $_api;
public function api(){
if(self::$_api != NULL) {
var_dump(1);
return self::$_api;
}else {
var_dump(2);
self::$_api = new Api();
return self::$_api;
}
}
}
说明第一次调用auth()进了api()的else执行语句,第二次调用render()进入if语句,说明返回的是同一个实例。
不管你调用多少次,返回的都是一个实例,这就是单例模式
$site = new Site();
echo $site->api()->auth();
echo $site->api()->render();
php如何返回值为000001而不是1 str_pad($number, 6, '0', STR_PAD_LEFT);
sprintf("%06d", $num);
过大浮点型数据比较大小https://segmentfault.com/q/1010000009860352
if(bcsub($a,$b,1)==0){
echo '相等';
}
$a = 12345678912345678.8;
$b = 12345678912345678.9;
if (strval($a) == strval($b)) {
echo '相等';
}
去除多维数组的最外层key 保留值 接口 sign 被破解的可能性猜想
//保密token串
$token = '249238jdush24hgdddf/sds_assd_&ssa23_sd';
//业务参数对开公开
$str = 'name=zhangsan&id=23';
//保密的签名算法
$sign = md5($str.$token);
只要你的token不被泄露,此方法不会有问题。
更加保密一点的方案是加上timestamp,比如大于600秒之外的请求全部无效。
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
echo "nctf{*****************}";
} else {
echo "false!!!";
}}
else{echo "please input a";}
不超时的后台进程or守护进程or在若干小时后执行的cron进程 如果你的系统使用systemd,可以利用它的计时器systemd.timer来完成你的需求 文章里的at的at now + n units是一个很好的选择 openssl linux 和 windows 下 密钥签名结果不一致
echo aaaaa | openssl rsautl -sign -inkey xxxx.pem | openssl enc -base64
"echo aaaaa"输出的结果带回车,即“aaaaa\n”,要输出纯字符串“aaaaa”的话需要使用"echo -n aaaaa",不确定是不是这个原因,仅供参考
在linux和windows输出时字符时的问题,在Linux上会追加\n,而在Windows上会追加\r\n。对于这种情况,可以使用python来进行兼容:
import base64
data = 'aaaaa'
base64.b64encode(data)
>>> 'YWFhYWE='
foreach既然是操作原数组的副本,为什么这样写还能改变原数组呢 你加了&符号后不是使用的是原数组的拷贝。不加&符号确实是原数组的拷贝。加&符号相当于一个指针,把名字赋给它而已。所以你改变你新的数组,原来的数组也会改变。自 php 5 起,可以很容易地通过在 $value 之前加上 & 来修改数组的单元。此方法将以引用赋值而不是拷贝一个值。
>> import re >>> str = 'aaabccc11fdsa' >>> re.findall(r'((\w)\2+)', str) [('aaa', 'a'), ('ccc', 'c'), ('11', '1')] >>> [match[0] for match in re.findall(r'((\w)\2+)', str)] ['aaa', 'ccc', '11'] 第一是用sys.path.append()方法,将当前目录添加到模块搜索的目录列表中,如sys.path.append(dir_path) 第二是将当前目录的路径添加到系统的PYTHONPATH环境变量里去 import json str = ''' <script type="application/ld+json">{ "@context": "http://schema.org", "@type": "SaleEvent", "name": "10% Off First Orders", "url": "https://www.myvouchercodes.co.uk/coggles", "image": "https://mvp.tribesgds.com/dyn/oh/Ow/ohOwXIWglMg/_/mQR5xLX5go8/m0Ys/coggles-logo.png", "startDate": "2017-02-17", "endDate": "2017-12-31", "location": { "@type": "Place", "name": "Coggles", "url": "coggles.co.uk", "address": "Coggles" }, "description": "Get the top branded fashion items from Coggles at discounted prices. Apply this code and enjoy savings on your purchase.", "eventStatus": "EventScheduled" }</script> ''' d = json.loads(re.search('({[\s\S]*})', str).group(1)) print d['location']['url'] ``` [Python如何统计某一文件夹下文件数量](https://segmentfault.com/q/1010000009917433) ```js tite = '......' #网页title中包含换行 print(re.findall('(?<=\).+?(?=\<)', title, re.S)) 就是让你配置好环境变量而已. 如果你有一个项目叫做pythonCodes, 然后你要在系统属性->环境变量->path, 将你这个pythonCodes绝对路径加进去, 这样的话, 你在pythonCodes里面写python脚本, 例如command.py, 就能够直接通过win+R,然后通过输入command.py直接运行.. Python默认查找包的地方有以下几个: Python安装目录下的site-packages目录 环境变量PYTHONPATH的目录 当前目录 sys.path.append(...)添加的目录(这个是临时的) 然而如果你只把包放在了C盘下面,那么它不属于任何一种情况,Python当然就找不到包了。除了sys.path.append()方法,上面方法中还有将C:\加到PYTHONPATH环境变量也是可以的。 XPath中变量用$somevariable语法即$符号加变量名,然后在xpath方法调用时传参变量值。 xpath中如何使用变量 >>> # `$val` used in the expression, a `val` argument needs to be passed >>> response.xpath('//div[@id=$val]/a/text()', val='images').extract_first() u'Name: My image 1 ' >>> import os >>> DIR = '/tmp' >>> print len([name for name in os.listdir(DIR) if os.path.isfile(os.path.join(DIR, name))]) http不只有get方法(请求头部+正文),还有head方法,只请求头部。 import re, requests r = requests.get("http://...页面地址..") p = re.compile(r'相应的正则表达式匹配') image = p.findall(r.text)[0] # 通过正则获取所有图片的url ir = requests.get(image) # 访问图片的地址 sz = open('logo.jpg', 'wb').write(ir.content) # 将其内容写入本地 print('logo.jpg', sz,'bytes') ``` []() [这几个软件你可能没听过,但真的好用到爆!](https://zhuanlan.zhihu.com/p/27479267) 第一款神器叫Listary,这是一款文件搜索的工具。第二款神器叫图片助手,这是一款图片下载的工具。 第五个神器叫Listen1 ,这是知友stormzhang推荐的神器 文字云的工具,以前讲过叫tagul,现在改名叫WordArt,是一个在线文字云的生成网站第七个神器是 http://UZER.ME 这是一个云端的应用网站 [Python Selenium WebDriver简明指南](http://www.revotu.com/python-selenium-webdriver-concise-guide.html) ```js 等待元素动态加载完成 driver = webdriver.Firefox() driver.implicitly_wait(10) # seconds driver.get("http://somedomain/url_that_delays_loading") myDynamicElement = driver.find_element_by_id("myDynamicElement") ``` [Python获取当前时间](http://www.revotu.com/how-to-get-current-time-in-python.html) ```js import time ## 24 hour format time.strftime("%H:%M:%S") # 输出 18:58:17 ## 12 hour format time.strftime("%I:%M:%S") # 输出 06:58:17 time.strftime("%Y-%m-%d") # 输出 2017-06-23 datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 输出 2017-06-23 18:58:17 now = datetime.datetime.now() # 当前datetime,输出 datetime.datetime(2017, 6, 23, 19, 13, 43, 555000) now.year # 年 now.month # 月 now.day # 日 now.hour # 时 now.minute # 分 now.second # 秒 now.isoformat() # Date and time in ISO format,输出 2017-06-23T19:16:21.835000 ``` [把自己fork别人的仓库中的代码更新至最新版本?](https://segmentfault.com/q/1010000009818126) ```js git remote add upstream 原作者仓库地址 此时再用 git remote -v 就可以看到一个origin是你的,另外一个upstream是原作者的。 其次 更新代码 使用git fetch upstream 拉去原作者的仓库更新。 使用git checkout master 切换到自己的master 使用 git merge upstream/master, merge或者rebase到你的master ``` [想导出微信的朋友圈怎么办?](https://www.zhihu.com/question/25026007/answer/183261557) [shell脚本中怎么判断发行版](https://segmentfault.com/q/1010000009829086) uname -a 会给出 Linux/Unix, 32/64 位等信息 lsb_release -a cat /proc/version cat /etc/*-release [如何对api接口进行限流](https://segmentfault.com/q/1010000009874889) 既然问题的标签里有 laravel,那么现成的解决方案,我推荐,https://github.com/dingo/api,这个包有个特性 Rate Limiting,应该就是你要找的。 如果你要自己实现也简单的,根据 【user_id + 设备唯一码】做主键,访问次数存 redis,记录访问的次数,然后具体频率,次数,都看你实现策略了 http://blog.41ms.com/post/61.html Nginx 模块limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; [PHP 下载 url 远程图片](https://zhuanlan.zhihu.com/p/27484500) ```js function download($url, $path = 'images/') { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $file = curl_exec($ch); curl_close($ch); $filename = pathinfo($url, PATHINFO_BASENAME); $resource = fopen($path . $filename, 'a'); fwrite($resource, $file); fclose($resource); } 作者:Jelly Bool 链接:https://zhuanlan.zhihu.com/p/27484500 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 ``` [PHP能做什么好玩的事?](https://www.zhihu.com/question/36157365/answer/187230179) ```js 基于Swoole,寥寥几行PHP代码就能轻松实现一个基于WebSocket(全双工通信)的聊天室. server.php: on('message', function($ws, $frame) { // 消息建议用JSON格式,这里为了方便示例,用普通字符串 $msg = 'From ' . $frame->fd. ':
' . $frame->data . '
时间: ' . date('Y年m月d日 H:i:s') . '
index.php:
<script> var ws = new WebSocket("ws://0.0.0.0:8080"); ws.onmessage = function(e) { $("#content").prepend(e.data); } $(document).on("click", "#send", function() { ws.send($("#msg").val()); }); </script>
[mysql查询所有曾经降过薪的员工 emp_no 以及降薪幅度](https://www.v2ex.com/t/370157)
select a.emp_no,b.salary-a.salary, a.to_date
from salaries a join salaries b
on a.emp_no=b.emp_no and a.to_date>b.to_date and a.salary<b.salary and a.from_date=b.to_date;
[PHP 中'false'等于 true '0'==false](https://www.v2ex.com/t/369755)
```js
当字符串和布尔值进行比较时,会先将字符串转换成布尔值。
而字符串中除了'0'等于false之外,其他字符串都等于true。
即便是'0.0'、'-0'也都等于true。
$a= 0;
var_dump($a == "imageUrl");//输出 bool(true)
$falseArr = [
'',
'0',
0,
false,
[],
null
];
$trueArr = [
' ',
'false',
'123',
'abc',
1,
true,
['val'],
new stdClass,
function(){}
];
$print = function ($arr) {
foreach ($arr as $v) {
var_dump($v==false);
}
};
$print($falseArr);
echo "\n";
$print($trueArr);
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
喜马拉雅在线json 解决Redis之MISCONF Redis is configured to save RDB snapshots 强制关闭Redis快照导致不能持久化。 127.0.0.1:6379> config set stop-writes-on-bgsave-error no set stop-writes-on-bgsave-error yes php在线库 支付宝即时到账 SDK 简化版 支付宝 手机网站支付快速接入 手机网站支付老版本请求支付宝的网关地址为:https://mapi.alipay.com/gateway.do;
手机网站支付新版本请求支付宝的网关地址为:https://openapi.alipay.com/gateway.do; 如果使用 md5 不需要秘钥 新接口需要创建应用 Payment是一个php版本的支付聚合第三方sdk,集成了微信支付、支付宝支付 支付宝SDK在Laravel5的封装。 微信自动加群 密码79yd http://mp.weixin.qq.com/s/Q5IfQvxD7sTueGjtRfq9Kg
import itchat
from itchat.content import *
#自动同意好友申请
@itchat.msg_register(FRIENDS)
def add_friend(msg):
itchat.add_friend(**msg['Text']) # 该操作会自动将新好友的消息录入,不需要重载通讯录
itchat.send_msg('你好,回复[我要加群]获取群信息哦', msg['RecommendInfo']['UserName'])
# 回复群消息
@itchat.msg_register('Text')
def text_reply(msg):
#查看msg中都有啥
# print( msg['FromUserName']) #发信息的人的UserName
#创建一个字典用来保存群名称
qun_name = []
#存储群的username
qun_username = {}
#保存群名称和对应的MemberList
qun_member_list = {}
#群名称和对应群成员的数量
qun_name_count = {}
#应该在用户问之前获取所有群聊获取所有群聊
grouplist = itchat.get_chatrooms(update=True)[1:]
for group in grouplist:
# print( group['MemberCount'])
# print( group['MemberList'] )
qun_name.append(group['NickName'])
#根据群名称存入username
qun_username[ group['NickName'] ] = group['UserName']
qun_member_list[ group['NickName'] ] = group['MemberList']
qun_name_count[ group['NickName'] ] = group['MemberCount']
if msg['Text']=='我要加群':
itchat.send('你好,有以下群聊:\n{}'.format( qun_name ) , toUserName=msg['FromUserName'])
itchat.send('请回复你要加入的群名称[爱心]' , toUserName=msg['FromUserName'])
#https://github.com/jinfagang/blogo.git 写博客神器,人工智能自动生成博客,go语言实现,求star
#回复指定的群名称进群
#在qun_name中查找,看看是不是有该群
# print( len(qun_name ))
for i in range(0,len(qun_name)):
if msg['Text']==qun_name[i]:
#根据群名称获取对应的群所有成员信息
menber_list = qun_member_list.get( msg['Text'] )
for m in menber_list:
# 判断发消息的人的username是否在该群里面
if m['UserName'] == msg['FromUserName']:
itchat.send('你已加入该群聊,请勿重复增加!', toUserName=msg['FromUserName'])
return
#获取群名称对应的username
chatroomUserName = qun_username.get( msg['Text'] )
friend = msg['User']
#发送群邀请
itchat.add_member_into_chatroom(chatroomUserName, [friend], useInvitation=True)
if __name__ == '__main__':
itchat.auto_login(hotReload=True)
# 获取自己的UserName
myUserName = itchat.get_friends(update=True)[0]["UserName"]
# 显示所有的群聊,包括未保存在通讯录中的,如果去掉则只是显示在通讯录中保存的
itchat.dump_login_status()
itchat.run()
larave session问题,为什么每次session_id都要变 github怎么提交回退旧版本代码并更改后的文件到主分支上 让git命令行保存github的登录状态 echo命令本身默认会在输出字符串后面追加一个换行符,可以通过增加一个选项-n来阻止此默认行为echo -ne "\n" 删除当前目录下 10天前的子目录 find . -maxdepth 1 -type d -mtime +10|xargs rm -rf 将100之内的数字中文转换.. 正则表达式问题
filename = '2.txt' with open(filename) as f: for i in f: result = i.split() print result[1], result[-1]
php 如何解析既有值又有属性的 xml 标签?
$xml = simplexml_load_string($content);
foreach($xml->attributes() AS $a => $b) {
echo "$a = $b
";
}
数字变为文字
python中eval的问题
python有 decimal 和 fraction 2个模块用来进行高精度浮点计算
>>> from fractions import Fraction
>>> Fraction('0.3')-Fraction('0.1') == Fraction('0.2')
True
>>> from decimal import Decimal
>>> Decimal('0.3')-Decimal('0.1') == Decimal('0.2')
True
>>>
eval('0.3-0.1==0.2') # 输出为False, 是因为0.3-0.1=0.19999999999999998
eval('%d - %d == %d'%(0.3, 0.1, 0.2)) # 输出为True, 是因为你%d传入是整数,相当于0-0=0
eval('%s - %s == %s'%(0.3, 0.1, 0.2)) # 输出为False, 参考1
eval('%s - %s == %s'%('0.3', '0.1', '0.2')) # 输出为False, 参考1
python如何转换时间戳到"2017年6月12日 18点24分"这样的格式
import time
print('%s年%s月%s日 %s时%s分' % time.localtime(1497254119.69407)[:5])
timestamp = time.time() - 3600 # 时间戳
print(time.strftime('%Y{y}%m{m}%d{d} %H{H}%M{M}', time.localtime(timestamp)).format(y='年', m='月', d='日', H='时', M='分'))
#统计出现次数
lst = [1,1,2,2,3,3,4,4,5,6]
print len(set(lst))
#统计每种各出现几次
from collections import Counter
print dict(Counter(lst))
php字符串比较 Python 爬虫中完成 JavaScript 函数翻页? 一段不减的整数,如11111223333,怎么快速计算重复次数最多的那个数
其实这种标准字典格式的,eval是最简单的。https://segmentfault.com/q/1010000009813506
t='''{"status": "0", "msg": "ok", "result": {"name": "露水", "content":
"<p>释名在秋露重的时候,早晨去花草间收取。</p><p>气味甘、平、无毒。</p><p>主治用以煎煮润肺杀虫的药剂,或把治疗疥癣、虫癞的散剂调成外敷药,可以增强疗效。白花露:止消渴。百花露:能令皮肤健好。柏叶露、菖蒲露:每天早晨洗眼睛,能增强视力。韭叶露:治白癜风。每天早晨涂患处。</p>", "commentary": "", "translation": "", "appreciation": "", "interpretation": ""}}'''
a=eval(t)
请教linux的find命令如何按正则表达式过滤 find . -regex './[0-9]+_[0-9]+.zip' 如果需要将找到的文件删除则利用xargs(注意确定之后再删除):
find . -regex './[0-9]+_[0-9]+.zip'|xargs rm -f 如果不仅要删除还要得到删除的数量,可以这样:
find . -regex './[0-9]+_[0-9]+.zip'|tee >(wc -l 1>&2)|xargs rm -f
$array=[
['name'=>'张三','age'=>'23'],['name'=>'李四','age'=>'64'],
['name'=>'王五','age'=>'55'],['name'=>'赵六','age'=>'66'],
['name'=>'孙七','age'=>'17']];
$sort = array(
'direction' => 'SORT_ASC', //排序顺序标志 SORT_DESC 降序;SORT_ASC 升序
'field' => 'age', //排序字段
);
$arrSort = array();
foreach($array as $uniqid => $row){
foreach($row AS $key=>$value){
$arrSort[$key][$uniqid] = $value;
}
}
array_multisort($arrSort[$sort['field']], constant($sort['direction']), $array);
print_r($array);
Array
(
[0] => Array
(
[name] => 孙七
[age] => 17
)
[1] => Array
(
[name] => 张三
[age] => 23
)
[2] => Array
(
[name] => 王五
[age] => 55
)
[3] => Array
(
[name] => 李四
[age] => 64
)
[4] => Array
(
[name] => 赵六
[age] => 66
)
)
//定义一个学生数组
$students = array (
256=> array ( 'name' => 'jon' , 'grade' =>98.5),
2=> array ( 'name' => 'vance' , 'grade' =>85.1),
9=> array ( 'name' => 'stephen' , 'grade' =>94.0),
364=> array ( 'name' => 'steve' , 'grade' =>85.1),
68=> array ( 'name' => 'rob' , 'grade' =>74.6),
);
//按照名称进行排序
function name_sort( $x , $y )
{
return strcasecmp ( $x [ 'name' ], $y [ 'name' ]);
}
//按照成绩进行排序
function grade_sort( $x , $y )
{
return ( $x [ 'grade' ] > $y [ 'grade' ]);
}
uasort( $students , name_sort);
uasort( $students , grade_sort);
$arrayOld = array(
'17' => array('1'),
'11' => array('2'),
'10' => array('6'),
'9' => array('1'),
);
$arrayNew = [];
foreach($arrayOld as $key => $value){
$arrayNew[] = [(string)$key,$value[0]];
}
//print_r ($arrayNew);
function maps(&$array,$key) {
array_unshift($array, $key);
}
array_walk($arrayOld, 'maps');
print_r($arrayOld);
$sql="SHOW TABLE STATUS FROM " . DB_NAME;
$sql_tab='show full fields from `' . $array[$i]['Name'].'`'
中文字符字数读取 mb_strlen($data['content'],'utf8'); 对于中文来说,第二个参数请加上。
替换函数 用于隐私处理
$data['mobile'] = substr_replace($data['mobile'],'******',3,5); //将电话号码中间5位用*代替
$data['email'] = substr_replace($data['email'],'******',0,5); //将前位用*代替
var new = Array.from(
old.reduce((dict, item)=> {
if (dict.has(item.name)) {
dict.get(item.name).push(item.id)
} else {
dict.set(item.name, [item.id])
}
return dict
}, new Map())
).map(item => ({a: item[1], b: item[0]}))
var old = [
{
id: 1,
name: "first"
},
{
id: 2,
name: "first"
},
{
id: 3,
name: "second"
},
{
id: 4,
name: "second"
}
]new = [
{
a: [1, 2],
b: "first"
},
{
a: [3, 4],
b: "second"
}
]
var getNew = old => {
let temp = old.reduce((acc, cur) => {
if (acc[cur.name]){
acc[cur.name].push(cur.id);
} else {
acc[cur.name] = [cur.id]
}
return acc;
}, {});
return Object.keys(temp).map(key => {
return {
a: temp[key],
b: key
}
})
}
//https://segmentfault.com/q/1010000009821632
var hash = {};
var i = 0;
var res = [];
old.forEach(function(item) {
var name = item.name;
hash[name] ? res[hash[name] - 1].id.push(item.id) : hash[name] = ++i && res.push({
id: [item.id],
name: name,
type: item.type
})
});
console.log(JSON.stringify(res))
无限分类之无限方法 基于chrome扩展的脚本注入工具 来自新浪微博的面试题
function king ($n, $m){
$s = 0;
for($i=1;$i<=$n;$i++) {
$s = ($s+$m)%$i;
}
return $s+1;
}
echo king(5,2); // 3
$arr=
[
'赵','钱','孙','李',
'周','吴','郑','王',
'冯','陈','褚','魏',
'蒋','沈','韩','杨'
];
function countM($arr,$step)
{
$i=1;
while (count($arr)>1)
{
if ($i==$step)
{
array_shift($arr);
$i=0;
}else
{
array_push($arr,array_shift($arr));
}
$i++;
}
echo array_shift($arr);
}
function monkey($monkey, $x) {
$arr = range(1, $monkey);
$i = 0;
while (count($arr) > 1) {
if (($i+1) % $x !== 0) {
array_push($arr, $arr[$i]);
}
unset($arr[$i]);
$i++;
}
return implode('', $arr);
}
echo 'The winner is ' . monkey(5, 5);
Notadd 商城模块 https://github.com/notadd/notadd 2017 第三届PHP全球开发者大会PPT/Keynote 利用 ngrok 代替 在线测试服务器 进行开发的简单使用 Laravel 的命令 php artisan cache:clear 用来清除各种缓存,如页面,Redis,配置文件等缓存,它会清空 Redis 数据库的全部数据,比如默认使用的 Redis 的数据库是 db0,那么执行这个命令后,会清空 db0 中所有数据。Laravel的话,在Controller中要使用$msg = $request->getContent()获取原始数据。 ThinkSNS+ 是如何计算字符显示长度的 如何创建一个自己的 Composer 库 Zttp 发送 form params 请求 而非 JSON 请求 $response = Zttp::withHeaders(['Fancy' => 'Pants'])->post($url, [ 'foo' => 'bar', 'baz' => 'qux', ]);
$response->json(); Zttp::asFormParams()->post(bd_api_url(), $params);
\DB::listen(function($sql, $bindings, $time) {
foreach ($bindings as $replace){
$value = is_numeric($replace) ? $replace : "'".$replace."'";
$sql = preg_replace('/\?/', $value, $sql, 1);
}
dd($sql);
})
# 1. curl 命令方法
curl http://ipv4.icanhazip.com
# 2. 或者 php
php -r "readfile('http://ipv4.icanhazip.com');"
Trait 在我理解是一个不能实例化的class,用于实现多继承的关系。 你有一个杯子,空值代表杯子是真空的,NULL代表杯子中装满了空气,虽然杯子看起来都是空的,但是区别是很大的。
$user = User::find(1);
$user->touch();
用 touch() 方法可以不需要更新其他字段就用当前时间戳对 updated_at 进行更新。这个方法用来保存 最后一次处理时间 亦或者是 用户最近一次活跃时间 是极好的。
使用 ngrok 让外网也能访问本地 git clone https://github.com/HanSon/ngrok-script.git cd ngrok-script // if linux or mac ./ngrok.sh domain // if windows ngrok.bat domain 简单快速的开发 Web 应用, PHP 框架 Lemon 介绍 Laravel 核心——IoC 服务容器源码解析(服务器解析)
Allowed memory size of 134217728 bytes 错误解决心得 不下二十个字段,所有字段都查询出来肯定撑爆内存。 最后修改代码:$*****->get(["uid","loginid","steamid","created_at","name"]); 简单的初级压力测试