最近在项目中需要批量刷数据,但是由于项目的框架太老无法简单的使用命令行,而且项目比较急,所以想到之前的php关闭浏览器继续执行的路子,我记得php客户端断开继续执行需要配置nginx和fpm和php的配置,当时既修改php又修改fpm,但是找不到当时记录的配置信息了,后来想到自己之前测试过一个方法可行,于是翻出来了,代码如下:
//设置客户端断开依然运行
ignore_user_abort(true);
//设置脚本不超时
set_time_limit(0);
//死循环每隔1秒访问一次网址
while (true)
{
sleep(1);
@file_get_contents('http://xingxinghan.cn/?id=5');
}当时在windows下apache/nginx都测试过,linux下在本机测试过fpm和fast-cgi,于是直接用了上面的方法。
在测试环境和预发布环境都正常,但是到线上直接超时后脚本不再运行。害的产品和测试一直等我刷数据等到半夜。虽然我想到了fpm的配置项,但是当时脑子一片乱,没有想到。
也就是说上面的代码是在普通的cgi/fast-cgi下面是正常的,因为没有fpm的参与,脚本的执行时间受限于set_time_limit配置。
fpm环境中则由request_terminate_timeout配置时间决定,request_terminate_timeout 适用于当max_execution_time由于某种原因无法终止脚本的时候,会把这个php-fpm请求干掉。
但是还得找运维去修改配置的确麻烦,能不能自己在代码层参与。想了半天想到鸟哥科普的fastcgi_finish_request函数,这是一个fpm函数,开启了fpm才有。功能是提前向nginx响应请求,然后再去处理剩下的脚本代码。鸟哥文章原始链接https://www.laruence.com/2011/04/13/1991.html
于是我简单修改下代码,兼容下fpm的方法:
function execute($func)
{
$fpm_func = 'fastcgi_finish_request';
if (function_exists($fpm_func))
{
//fpm
fastcgi_finish_request();
}
else
{
//cgi/fast-cgi
set_time_limit(0);
ignore_user_abort(true);
}
$func();
}测试代码如下:
//执行任务内容
$func = function () {
$pid = getmypid();
$file = '1.txt';
while (true)
{
$date = date('Y-m-d H:i:s');
$text = "pid:{$pid},date:$date" . PHP_EOL;
file_put_contents($file, $text);
sleep(1);
}
};
//正式执行任务
execute($func);以上代码已经在win下apache/nginx的cgi/fast-cgi、linux下apache/nginx的cgi/fast-cgi/fpm下测试通过。phpenv集成环境中包含了fpm,貌似在windows中没看成有多大作用,fpm系列函数不可用,不过不影响执行。
切记!这是一个踩坑记录,不要偷懒,不要盲目自信,耗时的任务都走cli,如果要用这种方式最好加上日志记录,并且记录进程id,如果异常可以干掉相关进程,只限于刷数据,正式环境业务功能这么写就是猪!另外这种操作如果遇到不讲武德的web服务器,比如kangle/iis还可以不遵守这种规则,或者其他web服务器特殊配置超过就干掉你,也很无奈。
net5正式版发布了,推荐下还不错,优雅的c#语法、全面跨平台、原生二进制编译、更强的正则解析能力、保姆式开发工具人人都能简单入手。
md5/sha1+salt方式是目前各大cms常用的加密方式,虽然salt安全,但是各大md5网站也在研究这个方向,那么我们应该选择password_hash动态hash来助力,一种密码有多种hash结果.看代码模拟登陆.<?php //01.注册 $user ='zhang...
在编写多进程的实例中我在每个进程中使用如下代码://调用等待信号的处理器 while (true) { pcntl_signal_dispatch(); }开启5个进程,cpu直接100%修正之后的代码://调用等待信号的处理器 while&...
今天帮朋友查询wordpress执行超级慢的原因,特此记录开启fpm的慢日志,记录执行超过30秒的脚本request_slowlog_timeout = 30 slowlog = var/log/slow.log查看日志[23-May-2019 17...
posix_ttyname - 获取当前终端设备名称。<?php var_dump( posix_ttyname(STDOUT) );我们启动一个终端,执行上面的代码输出:/dev/tty1我们再启动一个终端,执行上面的代码输...
假如我们使用curl请求一个网站,如果这个网站域名在本地host中也存在,curl默认会请求本地,但是我们可以自己设置解析到哪个ip。(1).设置朋友的博客网站主机和ip,请求测试正确返回远程网站内容<?php $ip = '47.106.110.119'...
编写socket服务检测是否有新连接加入都要使用stream_socket_accept和socket_accept来获取,但是默认是阻塞的,想要更换为非阻塞并不能用stream_set_blocking($socket, false),因为stream_set_blocking只是设置socket...