Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在后台运行脚本所需的php shell_exec()帮助_Php_System_Exec_Shell Exec - Fatal编程技术网

在后台运行脚本所需的php shell_exec()帮助

在后台运行脚本所需的php shell_exec()帮助,php,system,exec,shell-exec,Php,System,Exec,Shell Exec,我的项目需要使用if-else条件运行3个php脚本。第一个脚本加载到站点的索引页上,以检查是否设置了条件,如果设置了条件,则调用第二个脚本。第二个脚本检查是否设置了其他条件,如果一切正常,它最终调用最后一个脚本 现在,我可以通过在if语句中包含脚本来实现这一点,但由于最终结果是占用资源的MySQL转储,因此我需要独立于原始触发器页面运行它 此外,这些脚本应该在触发后继续执行它们的操作,而不考虑用户在索引页面上的操作 最后一件事:它应该能够在赢和不赢的情况下运行 你会怎么做 下面的代码有意义吗

我的项目需要使用if-else条件运行3个php脚本。第一个脚本加载到站点的索引页上,以检查是否设置了条件,如果设置了条件,则调用第二个脚本。第二个脚本检查是否设置了其他条件,如果一切正常,它最终调用最后一个脚本

现在,我可以通过在if语句中包含脚本来实现这一点,但由于最终结果是占用资源的MySQL转储,因此我需要独立于原始触发器页面运行它

此外,这些脚本应该在触发后继续执行它们的操作,而不考虑用户在索引页面上的操作

最后一件事:它应该能够在赢和不赢的情况下运行

你会怎么做

下面的代码有意义吗

if ($blah != $blah-size){
shell_exec ('php first-script.php > /dev/null 2>/dev/null &'); 
 }
//If the size matches, die
else {
 }
万分感谢

更新:以防万一其他人也在经历同样的交易。 当以cgi的形式运行脚本时,php中似乎有一个bug,但Apache中的命令行适用于我测试过的所有版本

看到错误了吗

因此,我将脚本称为:

exec("php-cli mybigfile.php > /dev/null 2>/dev/null &"); 

或者你可以称之为外壳。它可以在nix系统上运行,但我的本地windows是没有希望的,因此如果有人在windows上运行它并且它可以工作,请更新它。

我认为最简单的方法是你可以这样做

exec(“screen-d-mPHP长时间运行脚本.php”)

然后它将立即返回并在后台运行。屏幕将允许您连接到它并查看发生了什么


您也可以使用“nohup php long running script.php”或编写一个简单的C应用程序来执行daemonize(),然后执行您的脚本。

我不会使用shell exec来执行此操作,因为您无法控制在任何时候运行多少占用资源的进程。因此,用户可以点击并基本上停止您的机器


相反,我会构建一个工作队列。脚本不会直接运行转储,而是将记录提交到某种FIFO队列(可能是数据库表或某个目录中的文本文件),然后立即返回。接下来,您将有一个定期运行的cron脚本,并检查队列以查看是否有工作要做。如果是这样,它会选择最古老的东西并运行它。这样,您就可以确保一次只运行一个转储。

创建另一个脚本工作程序,由cron/windows Scheduler运行。这一点的全部目的是不使用cron,而是由用户触发。:)嗨,Alex,脚本被组织为使用数据库表检查时间间隔,数据库的大小和其他一些东西。如果在给定条件下已经完成了相同的作业,则用户无法启动该作业。如果不满足条件,else语句将终止数据库连接。Cron作业是不可能的,因为它被设置为在没有设置Cron选项卡的任何设置上运行。感谢againexec(“screen-d-mphpmyfile.php”);我自己的代码也不起作用。如果我自己在浏览器中运行每个脚本,它们会执行它们应该执行的操作,但不会全部链接在一起。对于nohub,它会像exec('nohup php myfile.php/dev/null&;')?谢谢,很抱歉我必须回答我的问题,因为代码被弄乱了。我不明白你所说的“链接在一起”是什么意思。。对于nohup-是的,这是正确的方式(它主要意味着“运行这个应用程序,不要告诉它它终端不见了(不要传递HUP信号)”)。对于“屏幕”的东西不起作用-它可能没有安装在机器上。感谢你的帮助,Vasil,这似乎是php本身的一个错误,我已经用解决方案更新了我原来的问题。