PHP调用函数在单独的进程中

时间:2017-08-01 13:45:59

标签: php asynchronous execution

抱歉长篇文章。

我正在寻找一个想法,在特定行为发生时触发执行php功能(在不同的目录中,经过测试并在同一目录中)。

系统是Debian和php框架yii。

使用API​​,我们从远程服务器接收新数据,并且对于我们收到的数据中的特定值,我需要在单独的过程中启动功能。无需等待其完成。 由于API响应时间我无法将此功能集成到其中,因此集成会破坏API,使其无法使用。

我已经阅读了Stackoverflow和许多其他示例的几十个答案。

对于测试我只是尝试在特定位置创建新文件夹并且没有创建文件(我认为是权限问题,但是如果从主代码 - api完成它就无法确认)。 它应该做以下:

  • 将从API收到的2个参数传递给函数
  • 创建文件夹(如果它不存在)
  • 调用使用fpdf打印pdf文件的内部类。
  • 保存文档并使用PHPMailer邮寄。

无法使用pcntl_fork,因为它需要额外安装(我不允许这样做)。

涵盖主题:

  • 与pcntl_fork分叉(执行在到达时停止。)
  • popen / pclose,exec,proc_open / proc_close(没有回复,无法确认它实际输入的功能)。

当然,这种情况不包括使用include和require的可能性。

无法发布api代码,但这是我要求它做的事情:

background.php

$docs_dir='test_folder';
if (!file_exists('/var/www/created_documents/'.$docs_dir))
{
    mkdir('/var/www/created_documents/'.$docs_dir, 0777, true);
    chmod('/var/www/created_documents/'.$docs_dir, 0777);
}

它什么也没做。

我在api代码中使用的几个示例跳转到它(许多其他人在工作期间被删除)。

$proc = popen('php ' . __DIR__ . '/background.php &', 'r');
return $proc;
while (!feof($proc))
{
    $data = fgets($proc);
    var_dump($data);
}


exec("php background.php");


$cmd = "php background.php";
$timer = popen("start ". $cmd, "r");
pclose($timer);


exec($cmd . " > /dev/null &");
pclose(popen("php background.php &","r"));

1 个答案:

答案 0 :(得分:1)

您可以使用curl and its async funcionality制作单独的内部http请求。

或者您可以使用排队机制,其中一部分正在触发事件而另一部分正在消耗它。 RabbitMQGearman可以为您执行此操作。