如何在unix服务器上的后台运行PHP代码

前端之家收集整理的这篇文章主要介绍了如何在unix服务器上的后台运行PHP代码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的网站上,我有一些功能可以上传用户提供的数据.这些数据馈送通常具有超过30,000条记录.每条记录都需要经过复杂的验证过程.因此,简单地说,此Feed处理将花费超过1小时来完成任务.这个漫长的过程是不可避免的.

此供稿由公共用户上传.并且Feed大小小于5MB的文本文件.因此,我们不希望提供FTP访问,也不希望为这些用户提供命令行访问权限.只有我们更愿意通过网络访问上传Feed.我们必须在上传后立即处理Feed.一旦处理完毕,我们也必须向他们发送邮件报告.

现在问题是长时间运行的网页在许多网络工作上抛出一些代理超时问题(因为它需要1小时的响应).这是大多数客户端网络配置的问题.

上传Feed后,我需要一种方法来触发PHP脚本.并且该脚本应该在后台运行,同时正确完成页面加载而不会延迟客户端.

我将在后台处理数据并在完成该过程后将邮件发送给客户端. Cron选项卡在这里不可行,因为客户端可能每月只使用这些功能几次并且在意外的时间范围内.

如果有任何方法后台触发PHP脚本但通过Web访问请告诉我.

用于简化要求的示例脚本

假设此示例并帮助我修改此脚本以实现结果.我有两个PHP脚本“thread.PHP和createfile.PHP”.名称为“thread.PHP”的文件将由客户端通过Web浏览器打开.该脚本需要执行脚本“createfile.PHP”.但是需要20秒才能做出回应.但我们希望允许它在后台运行.并立即在浏览器中显示输出.

以下是示例脚本上的代码.

createfile.PHP(http://sugunan.net/demo/createfile.php)

<?PHP
sleep(20);
@unlink("PHPfile.txt");
$myfile = fopen("PHPfile.txt","w") or die("Unable to open file!");
$txt = date("h:i:s")."\n";
fwrite($myfile,$txt);
fclose($myfile);
mail("someone@example.com","Background process","Process completed");
?>

created file visible at web url: 07001

thread.PHP(http://sugunan.net/demo/thread.php)

<pre>
<?PHP
echo "Script start at: " . date('h:i:s') . "\n";
include("createfile.PHP"); //give a method to execute this script but in background without delay
echo "Script end at: " . date('h:i:s');
?>

这将给出以下输出与sleep()函数延迟.

Script start at: 02:53:27

Script end at: 02:53:47

有没有办法在没有include()方法的情况下执行“createfile.PHP”.并且在后台处理“createfile.PHP”时避免20秒的睡眠延迟?

请考虑我想避免客户端的等待时间,并希望立即在浏览器上输出.

使用exec()

http://php.net/manual/en/function.exec.php

这将允许您在另一个线程中运行长进程.我已将其用于所有其他PHP,Python或C应用程序,以将wav转换为mp3,视频转换或通过大型XML文件进行解析…

请确保在完成后通过电子邮件通知您或用户,以及是否成功.

使用purehuman.info/demo中的工作代码编辑…它实际上现在写入文件.
这就是我想让thread.PHP看起来像:

<?PHP 
    echo "Script start at: " . date('h:i:s') . "\n"; 
    exec("PHP -f  createfile.PHP /dev/null &"); 
    echo "Script end at: " . date('h:i:s'); 
?>

如果你在Windows中:

<?PHP 
    echo "Script start at: " . date('h:i:s') . "\n"; 
    exec("start /B PHP createfile.PHP"); //obvIoUsly change the paths etc where needed..
    echo "Script end at: " . date('h:i:s'); 
?>

需要对Windows部分给予信任:How to execue PHP scripts in the background using EXEC() and CMD

猜你在找的Bash相关文章