2016-12-31 26 views
1

我要做的事情有点复杂。使用PHP和计时器启动和终止后台python脚本

我有一个python脚本,我想从PHP运行它,但在后台。我曾经在某处看到,为了在后台运行一个python脚本,我必须使用PHP命令exec(script.py)来运行,而不用等待一个回报:至今没有问题。

第一个问题:

我必须停止与其他PHP命令这个循环脚本,如何做到这一点?

第二个问题:

我要实现服务器端的计时器,谁在结束的时候停止脚本。

我发现这个代码:

<?php 
$timer = 60*5; // seconds 
$timestamp_file = 'end_timestamp.txt'; 
if(!file_exists($timestamp_file)) 
{ 
    file_put_contents($timestamp_file, time()+$timer); 
} 
$end_timestamp = file_get_contents($timestamp_file); 
$current_timestamp = time(); 
$difference = $end_timestamp - $current_timestamp; 

if($difference <= 0) 
{ 
    echo 'time is up, BOOOOOOM'; 
    // execute your function here 
    // reset timer by writing new timestamp into file 
    file_put_contents($timestamp_file, time()+$timer); 
} 
else 
{ 
    echo $difference.'s left...'; 
} 
?> 

this答案。

然后,有一种方法可以在MySQL数据库中实现它? (与脚本停止的集成不是问题)

+0

https://secure.php.net/manual/en/function.exec.php#89716 使用它来获取进程ID,将其存储在文件或数据库中,然后杀死具有该进程的进程ID稍后。 请记住,无论小,过程可能已经停止,并且另一个过程最终使用该ID代替(这将意味着你正在杀死一个不同的过程) – xorinzor

回答

1

这实际上很简单。您可以使用内存对象缓存系统。我会推荐memcached。内存对象从memcached可以从系统中的任何地方逐字地访问。唯一的要求是支持到memcached后端服务器的连接。 (PHP确实,Python做等)

回答你第一个问题

创建一个名为stopme与在memcached数据库中的值0变量。

从您的python脚本连接到memcached数据库并永久读取变量stopme。比方说,当变量stopme的值为0时,python脚本正在运行。

为了阻止PHP脚本,从您的PHP脚本到memcached服务器的连接并设置stopme为1

的Python脚本接收即时和退出更新后的值。

回答你的第二个问题:

这是可以做到像我的回答解释之前通过阅读共享变量,但另外我想提一提,你也可以使用一个cronjob杀死正在运行的脚本。

+0

谢谢,我会尝试它。 – Northumber