Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.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
Windows PHP通过popen重复脚本_Php_Windows_Exec_Popen - Fatal编程技术网

Windows PHP通过popen重复脚本

Windows PHP通过popen重复脚本,php,windows,exec,popen,Php,Windows,Exec,Popen,我正在尝试在Windows上创建一个浏览器启动的自调用/重复PHP脚本,PHP目前为5.3.24,但很快将成为最新版本。它将充当守护进程,每隔几秒钟监控数据库中的更改,因此cron/schedule将退出,然后在发现更改时调用其他PHP脚本来执行工作。出于这个问题的目的,请忽略这样一个事实:我最好用C或其他语言来做: 为了简单起见,我开始尝试使用popen在后台运行第二个PHP脚本 // BatchMonitor.php SaveToMonitorTable(1); // save 1st

我正在尝试在Windows上创建一个浏览器启动的自调用/重复PHP脚本,PHP目前为5.3.24,但很快将成为最新版本。它将充当守护进程,每隔几秒钟监控数据库中的更改,因此cron/schedule将退出,然后在发现更改时调用其他PHP脚本来执行工作。出于这个问题的目的,请忽略这样一个事实:我最好用C或其他语言来做:

为了简单起见,我开始尝试使用popen在后台运行第二个PHP脚本

// BatchMonitor.php
SaveToMonitorTable(1);   // save 1st test entry to see if the script reached this point

$Command = '"" "C:\Program Files (x86)\PHP\v5.3\php.exe" C:\inetpub\wwwroot\Test.php --Instance=' . $Data->Instance;

pclose(popen("start /B $Command", "r"));
SaveToMonitorTable(2);   // save 2nd test entry to see if the script reached this point
exit();


// Test.php
SaveToTestTable(1);
Sleep(10);
SaveToTestTable(2);
exit();
如果我在浏览器中运行BatchMonitor.php,它可以正常工作。正如预期的那样,它会将1保存到监控表中,调用Test.php将1保存到测试表中,原始的BatchMonitor.php将在不等待响应的情况下继续,并在退出前将2保存到监控表中,然后10秒后,测试页面会在退出前将2保存到测试表中。第二个脚本启动正常,第一个脚本不等待回复,所有参数在脚本之间正确传递。在一切都按预期工作的情况下,我通过延迟调用自身而不是另一个脚本,将系统更改为一个重复循环

// BatchMonitor.php
SaveToMonitorTable(1);   // save 1st test entry to see if the script reached this point

$Command = '"" "C:\Program Files (x86)\PHP\v5.3\php.exe" C:\inetpub\wwwroot\BatchMonitor.php --Instance=' . $Data->Instance;

pclose(popen("start /B $Command", "r"));
SaveToMonitorTable(2);   // save 2nd test entry to see if the script reached this point
exit();
如果我在浏览器中运行BatchMonitor.php,它只运行一次,就是这样。它会将1保存到数据库中,等待10秒,然后将2保存到数据库中,然后退出。页面返回成功,没有脚本或PHP错误,但不会像应该的那样重复

BatchMonitor.php和Test.php都使用行对行相同的函数来获取参数,并且在第一次迭代中两个文件都正确且相同地运行。如果我使用exec而不是popen,那么页面将正确循环,所有逻辑都能正常工作,其中一个明显的缺陷是创建了一个永无止境的脚本链,等待永远不会出现的响应值


我错过了什么明显的东西吗?popen是否有某种防止页面/进程打开自身副本的秘密规则?除了使用popen或exec,还有其他选择吗?我读过关于WScript.Shell的文章,但我可能需要一段时间才能计划启用它,所以现在这不是一个选项,我希望有更标准的东西可以使用。

我觉得这不应该是你的实际答案,但为什么你要取消计划任务/cronjobs,因为你想每X秒完成一次?让脚本minute.php以5秒的间隔调用5seconds.php将每隔5秒创建一个重复的taak,对吗? 奇怪的是,你已经在浏览器中使用了同样的机制。
我唯一关心的是考虑处理的时间,并创建一个安全的脚本,确保在任何给定时间运行不超过1'5seconds.php'。

我以前见过这个答案,因为它可以工作,所以我正在考虑它。此应用程序或类似外部C应用程序的主要缺点是,它需要较低级别的服务器访问权限。这对我来说不是一个问题,但它可能会在将来为其他开发人员带来麻烦。即使我走了这条路,我仍然想弄明白为什么仅仅为了知识这条路不起作用。你试过记录popen返回的内容吗?还是说你输了?我还建议您检查更改的命令上的文件路径是否正确。并且BackMonitor和Test的权限完全相同。phppopen返回资源id 1,pclose返回0。当我调用Test.php时也是如此,它工作正常。验证PHP和脚本的文件路径,并且权限相同。