如何运行PHP代码asynchronous
我怎样才能不用等待而asynchronous运行PHP代码? 我有一个长期运行(几乎是无限),应该在服务器启动时运行,并应该不等待而asynchronous处理。
我猜可能的select是:
- 在网页中运行代码并保持打开状态来完成这个任务
- 从一些命令行实用程序调用脚本(我不知道如何)将在后台处理。
我在我的本地服务器上运行PHP脚本,当发生某些事件时会发送电子邮件,例如生日提醒。
请build议如何在不打开浏览器页面的情况下实现这一点。
如果你想从浏览器运行它(也许你不熟悉命令行),你仍然可以做到这一点。 我在几个月前研究了许多解决scheme,最可靠和最简单的实现方法如下: 如何在PHP中发布asynchronousHTTP请求
<?php $params['my_param'] = $a_value; post_async('http:://localhost/batch/myjob.php', $params); /* * Executes a PHP page asynchronously so the current page does not have to wait for it to finish running. * */ function post_async($url, array $params) { foreach ($params as $key => &$val) { if (is_array($val)) $val = implode(',', $val); $post_params[] = $key.'='.urlencode($val); } $post_string = implode('&', $post_params); $parts=parse_url($url); $fp = fsockopen($parts['host'], isset($parts['port'])?$parts['port']:80, $errno, $errstr, 30); $out = "POST ".$parts['path']." HTTP/1.1\r\n"; $out.= "Host: ".$parts['host']."\r\n"; $out.= "Content-Type: application/x-www-form-urlencoded\r\n"; $out.= "Content-Length: ".strlen($post_string)."\r\n"; $out.= "Connection: Close\r\n\r\n"; if (isset($post_string)) $out.= $post_string; fwrite($fp, $out); fclose($fp); }
比方说上面的文件在你的web根目录( /var/www
)中,例如runjobs.php。 通过访问http://localhost/runjobs.php
你的myjob.php
文件将开始运行。 你可能想要添加一些输出到浏览器,让你知道它已经成功提交,如果你的web服务器对世界其他地方开放,那么添加一些安全措施也不会有什么坏处。 如果添加一些安全性,这个解决scheme的一个好处就是您可以在任何可以find浏览器的地方开始工作。
肯定听起来像一个cron任务的工作。 你可以设置一个php脚本来完成你的任务,并让cron按照你喜欢的频率运行。 下面是关于如何让php脚本作为cron任务运行的一个很好的写法; 这很容易做到。
这不是PHPdevise的。 您必须使用PECL线程库来分离asynchronous运行的线程,我不推荐它。 asynchronous部门新的热点是node.js – 我build议你看看,看看你是否可以利用它。 它专为轻量级asynchronousnetworking操作而devise,可以用来启动PHP脚本。
如何在不等待的情况下asynchronous运行PHP代码。 我有一个长跑(几乎inifinite),应该在服务器启动时运行,应该不加处理地asynchronous处理。
假设一个典型的LAMP系统,你可以用命令行启动一个PHP守护进程
root# php yourscript.php &
其中yourscript.php包含类似的东西
<?php $log = fopen('/var/log/yourscript.log', 'a+'); // ### check if we are running already omitted while(true) { // do interesting stuff and log it. // don't be a CPU hog sleep(1); } ?>
装饰:使您的脚本直接可执行:chmod + x yourscript.php并添加#!/ usr / bin / php到您的脚本开始
要开始使用apache,您应该将该命令添加到您的apache启动脚本(通常是apachectl),并确保在apache停止时添加代码来终止它。
检查你是否已经运行了一个文件,其中你的PID在/ var / locks /和类似于system('/ bin / ps'。$ thePID)的东西里。 这也使得杀死指令更容易编写。
谢谢托德查菲但它不是为我工作,所以我编辑你的代码,我希望你不会介意,也可能是它也将帮助其他人使用这种技术
cornjobpage.php // mainpage
<?php //if you want to call page for multiples time wrt array //then uncomment loop start & end) ?> <?php //foreach ($inputkeywordsArr as $singleKeyword) { $url="http://localhost/projectname/testpage.php"; $params['Keywordname'] = "testValue";//$singleKeyword post_async($url, $params); //}//foreach ($inputkeywordsArr end ?> <?php /* * Executes a PHP page asynchronously so the current page does not have to wait for it to finish running. * */ function post_async($url, array $params) { foreach ($params as $key => &$val) { if (is_array($val)) $val = implode(',', $val); $post_params[] = $key.'='.urlencode($val); } $post_string = implode('&', $post_params); $parts=parse_url($url); $fp = fsockopen($parts['host'], isset($parts['port'])?$parts['port']:80, $errno, $errstr, 30); $out = "GET ".$parts['path']."?$post_string"." HTTP/1.1\r\n";//you can use POST instead of GET if you like $out.= "Host: ".$parts['host']."\r\n"; $out.= "Content-Type: application/x-www-form-urlencoded\r\n"; $out.= "Content-Length: ".strlen($post_string)."\r\n"; $out.= "Connection: Close\r\n\r\n"; fwrite($fp, $out); fclose($fp); } ?>
testpage.php
<? echo $_REQUEST["Keywordname"];//Output > testValue ?>