2014-01-13 58 views
0

我想用PHP创建一个浏览器启动的自调用/重复PHP脚本(当前是5.3.24,但很快会是最新的)。它将作为一个守护进程监视数据库中的更改(每隔几秒钟,因此cron/schedule已停止),然后在发现更改时调用其他PHP脚本执行工作。为了这个问题的目的,请忽略这样一个事实,即我最好在C#或其他语言中这样做:)Windows PHP通过popen重复脚本

为了保持简单,我开始尝试使用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的内容,但是可能需要一段时间才能安排启用,所以现在它不是一种选择,我希望有更多的标准可以使用。

+0

你有没有试过记录什么popen返回?或pclose?我还建议你检查一下你的命令文件路径是否正确。 BackMonitor和Test.php的权限完全相同 – Dan

+0

popen返回“Resource id#1”并且pclose返回0.这与我调用Test.php时相同,并且工作正常。 PHP和脚本的文件路径都经过验证,权限相同。 –

回答

0

我不觉得这应该是你的实际答案,但你为什么要解散计划任务/ cronjobs,因为你想每X秒完成一件事情?让脚本minute.php调用5seconds.php与betweencouse之间的5秒间隔会创建一个重复的扯掉5秒的权利? 奇怪的是,你已经有点从浏览器中使用相同的机制了。 我唯一需要考虑的是处理时间,并创建一个安全的脚本,以确保在任何给定时间不会超过1'5seconds.php'。

+0

我以前见过这个答案,因为它会起作用我正在考虑它。 这个或类似外部C#应用程序的主要缺点是它需要对服务器进行较低级别的访问。这对我来说不是问题,但它可能会在未来为其他开发者带来复杂的问题。 即使我走这条路线,我仍然想知道为什么这不仅仅是为了知识而起作用。 –