与正在运行的php进程交互

与正在运行的php进程交互,php,Php,我想知道是否有一种方法可以在循环中以进程的形式运行代码,并从不同的脚本与之交互。我知道套接字监听传入的请求,但我指的是内部使用,没有请求 不,您不能直接访问另一个正在运行的脚本,因为每个脚本都在自己的资源沙盒上运行(内存、文件描述符)。为了访问它,您还需要知道它是PID,然后,您需要一些黑客工具才能进入该进程空间。我有一种情况,类似的方法。 我通过分叉来启动独立的流程,而不是等待它们——只启动。但我已经在数据库中创建了控制结构。在那里,每个子进程都在存储它的状态,但也会观察一个控制标志,当这个标

我想知道是否有一种方法可以在循环中以进程的形式运行代码,并从不同的脚本与之交互。我知道套接字监听传入的请求,但我指的是内部使用,没有请求

不,您不能直接访问另一个正在运行的脚本,因为每个脚本都在自己的资源
沙盒上运行(内存、文件描述符)。为了访问它,您还需要知道它是PID,然后,您需要一些黑客工具才能进入该进程空间。

我有一种情况,类似的方法。 我通过分叉来启动独立的流程,而不是等待它们——只启动。但我已经在数据库中创建了控制结构。在那里,每个子进程都在存储它的状态,但也会观察一个控制标志,当这个标志出现时,子进程立即停止。子进程将带时间戳的记录存储在另一个表中,让我来检查它的任务所在的进程。 在控制结构中,还存储处理PID,并且可以向其发送信号。
我认为这在您的情况下也很有用。

当php进程启动时,它会考虑所有需求,例如变量链接页面等。。并在它完成执行后显示结果,在它完成执行后,您只能重新执行


这就像在月球上野餐,结束后回到家一样,所以当你野餐时,没有人会打扰你D

我想说的是,首先,您设置了在后台运行的脚本。您可以自己实现(使用fork)或使用现有库。

然后定义一个通信协议。根据您的需要,有很多方法可以实现这一点,从简单到复杂


例如,一种简单的方法是在服务器中的某个位置定义一个文件夹,脚本定期读取该文件夹(循环+睡眠)。添加文件时,脚本将读取该文件,执行其中的指令,然后将其删除。

这可能无法完全满足您的要求。但威尔会:


尝试将第一个脚本的状态记录到文本文件中,并经常从第二个脚本读取,以了解第一个脚本的当前状态。

标准方法:

使用和函数通过标准或用户定义的信号进行交互

优点:

  • PHP内置的、随时可用的函数。不需要重新发明轮子
  • POSIX兼容性
缺点:

  • 只能向脚本发送定义的信号。不是价值观
  • 单向交互
监听脚本示例:

<?php
pcntl_signal(SIGTERM, 'sig_handler');
pcntl_signal(SIGUSR1, 'sig_handler');

echo 'Run... PID: ' . getmypid() . PHP_EOL;

$finish = false;
while (!$finish) {
    pcntl_signal_dispatch();
}

echo 'Shutdown...' . PHP_EOL;

function sig_handler($signal) {
    global $finish;
    echo 'Received signal: ' . $signal . PHP_EOL;
    switch ($signal) {
        case SIGTERM:
            $finish = true;
        break;
        case SIGUSR1:
            echo 'Processing SIGUSR1 signal...' . PHP_EOL;
        break;
    }
}

你是说像一个守护进程?我不确定你对这个问题的解释是否理解。PHP脚本可以相互交互,也可以与其他脚本交互。可以通过多种方式完成,比如使用端口套接字、数据库、简单文件进行通信。如果他启动进程,那么获得pids有什么问题?是的,你不能直接访问某些脚本,但有一种信号机制——至少你可以停止它。@maalls:asker提到内部访问,没有任何信号机制connections@KanchoIliev:好的,如果这是询问者想对另一个进程做的唯一事情,那么信号发送就可以工作(假设他在unix/linux机器上运行)谢谢你的回答,我说的是从命令行运行的循环脚本。谢谢你的回答,只是为了弄清楚实现,我如何循环检查运行脚本中是否有新信号到达?我知道我使用posix kill向侦听脚本发送信号,但我如何侦听?伟大的回答顺便说一句@Patrick在答案中添加了一个简单的听力示例。不用于生产使用。非常感谢!进行了一些重大调整,但效果良好:)