<?php
while(true){
//code goes here.....
}
?>
我想制作一个PHP Web服务器,那么如何使用Curl让这个脚本永久运行?
<?php
while(true){
//code goes here.....
}
?>
我想制作一个PHP Web服务器,那么如何使用Curl让这个脚本永久运行?
不要忘记将最大执行时间设置为无限制(0)。
如果您的意图是这样,最好确保您不要运行多个实例:
ignore_user_abort(true);//if caller closes the connection (if initiating with cURL from another PHP, this allows you to end the calling PHP script without ending this one)
set_time_limit(0);
$hLock=fopen(__FILE__.".lock", "w+");
if(!flock($hLock, LOCK_EX | LOCK_NB))
die("Already running. Exiting...");
while(true)
{
//avoid CPU exhaustion, adjust as necessary
usleep(2000);//0.002 seconds
}
flock($hLock, LOCK_UN);
fclose($hLock);
unlink(__FILE__.".lock");
如果是在CLI模式下,只需运行该文件。
如果在Web服务器上的另一个PHP中,你可以像这样启动必须无限运行的PHP文件(而不是使用cURL,这样可以消除依赖):
$cx=stream_context_create(
array(
"http"=>array(
"timeout" => 1, //at least PHP 5.2.1
"ignore_errors" => true
)
)
);
@file_get_contents("http://localhost/infinite_loop.php", false, $cx);
或者您可以使用类似于以下方式的Linux Cron启动wget:
`* * * * * wget -O - http://localhost/infinite_loop.php`
您可以通过使用bitsadmin在Windows计划任务中运行一个包含以下内容的.bat文件来开始:
bitsadmin /create infiniteloop
bitsadmin /addfile infiniteloop http://localhost/infinite_loop.php
bitsadmin /resume infiniteloop
set_time_limit(0);
// 这样 PHP 才不会像正常情况下终止,如果你将要处理的内容需要很长时间才能完成setInterval()
, setTimeout()
编辑: 但是,如果您将设置一个 cron 作业,则可以避免使用客户端处理。
编辑: 我的建议是,除非您有一个告诉它在一段时间后退出循环的代码,否则不要使用无限循环。请记住,您将使用 cron 作业调用同一页,因此保持循环无限没有意义。[编辑] 否则,您将需要像 @Tiberiu-Ionuț Stan 建议的锁定系统,以便每次调用 cron 作业时只运行1个实例。
默认情况下,不行,因为PHP有执行时间限制。 请参见:http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time
您可以通过设置值或在脚本中调用set_time_limit
来使其永久运行(http://php.net/manual/en/function.set-time-limit.php)。
但我不建议这样做,因为PHP(由HTTP请求调用)不是设计为具有无限循环。如果可以的话,请改用本地脚本,或者按间隔请求页面以频繁执行任务。
如果您的网站经常被其他人浏览,您可以在每个页面上执行此操作。
(想象一下,如果有人多次请求脚本,您将有多个实例正在运行)
curl
如何表明是从Web浏览器中运行的。 - Adicurl
就意味着你是从 HTTP 请求中运行的!你确定你知道 curl
的工作原理吗?Curl 可以帮助你在脚本内部进行 HTTP 请求,它与你如何运行该脚本(HTTP 请求或命令行)无关。 - Adi
while(true)
,没错它会一直运行直到发生某些事情(最好是由你指定的中断条件)。 - Adiphp server.php
运行时,该限制不适用。为什么有人想要从Web浏览器永久运行服务器呢? - Adiwhile(true)
会让CPU不断执行指令,例如:永远执行cmp
。如果没有真正的工作要做,请考虑在循环内部加入睡眠机制。 - Accountant م