PHP 在单独的进程中调用函数
PHP call function in separate process
抱歉,文字太长了。
我正在寻找一个想法来触发执行 php 函数(在不同的目录中,测试并在同一目录中)当特定行为发生时。
系统是 Debian 和 php 框架 yii。
使用 API 我们从远程服务器接收新数据,对于接收到的数据中的特定值,我需要在单独的进程中启动函数。无需等待其完成。
因为 API 响应时间我无法将此功能集成到其中并且集成中断 API 使其无法使用。
我在 Whosebug 上阅读了数十个答案和许多其他示例。
为了测试,我只是尝试在特定位置创建新文件夹,但没有创建文件(我认为是权限问题,但无法确认,因为如果从主代码完成它就会成功 - api)。
它应该执行以下操作:
- 将从 API 收到的 2 个参数传递给函数
- 如果不存在则创建文件夹
- 调用使用 fpdf 打印 pdf 文件的内部 class。
- 保存文档并用 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"));
抱歉,文字太长了。
我正在寻找一个想法来触发执行 php 函数(在不同的目录中,测试并在同一目录中)当特定行为发生时。
系统是 Debian 和 php 框架 yii。
使用 API 我们从远程服务器接收新数据,对于接收到的数据中的特定值,我需要在单独的进程中启动函数。无需等待其完成。 因为 API 响应时间我无法将此功能集成到其中并且集成中断 API 使其无法使用。
我在 Whosebug 上阅读了数十个答案和许多其他示例。
为了测试,我只是尝试在特定位置创建新文件夹,但没有创建文件(我认为是权限问题,但无法确认,因为如果从主代码完成它就会成功 - api)。 它应该执行以下操作:
- 将从 API 收到的 2 个参数传递给函数
- 如果不存在则创建文件夹
- 调用使用 fpdf 打印 pdf 文件的内部 class。
- 保存文档并用 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"));