【问题标题】:PHP call function in separate process单独进程中的PHP调用函数
【发布时间】:2017-08-01 13:45:59
【问题描述】:

抱歉,文字太长了。

我正在寻找在特定行为发生时触发 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"));

【问题讨论】:

  • 听起来像是在使用队列,将作业堆叠起来并在后台处理它们。
  • 很难在 dar 中开发,使用以下 2 行将错误记录在文件中:ini_set("log_errors", 1); ini_set("error_log", path_to_file);

标签: php asynchronous execution


【解决方案1】:

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

或者您可以使用队列机制,其中一部分正在触发一个事件,另一部分正在使用它。 RabbitMQGearman 可以为您做到这一点。

【讨论】:

  • Curl 看起来是唯一的选择,因为我无法安装任何新东西。将继续尝试这种方法。
  • 感谢您的建议。我稍后会尝试,因为我不得不同时更改到另一个子项目。
猜你喜欢
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多