相关疑难解决方法(0)

执行另一个 PHP 文件而不等待它完成执行

我有 StartServer.php 文件,如果服务器尚未启动,它基本上会启动服务器。一切都很完美,除了 StartServer.php 将永远挂起,等待 shell_exec() 文件 Server.php 完成其执行,但它永远不会完成。

有没有一种方法可以执行 PHP 文件,然后就忘记它,而不是等待其执行完成?

编辑:它必须在 Windows 和 Linux 上运行。

php

5
推荐指数
1
解决办法
6312
查看次数

php system()shell_exec()挂起浏览器

可能重复:
PHP中的异步shell exec

我需要在后台运行一个java程序.

process.php包含

shell_exec("php php_cli.php")

php_cli.php包含

shell_exec("java -jar BiForce.jar settings.ini > log.txt");
Run Code Online (Sandbox Code Playgroud)

我使用ajax异步调用process.php

当我单击调用ajax函数的网页中的链接(用于运行process.php)时,webage显示"正在加载".当我同时点击其他链接时它没有响应.

java程序大约需要24小时才能完成执行,因此用户不会等到执行结束.

问题是浏览器继续加载,并且在单击链接时不会转到其他页面.

我也尝试过system(),但同样的问题....

非常感谢帮助.

php shell-exec

5
推荐指数
2
解决办法
7284
查看次数

重启Apache杀死后台进程

我有一个脚本startbg.php

echo `/usr/bin/php $dir/runbg.php >> $dir/logbg.txt 2>&1 &`;
Run Code Online (Sandbox Code Playgroud)

我从网络调用(通过 HTTP/Apache)。

runbg.php在后台进程中运行。

但是如果我重新启动 Apache ( /etc/init.d/apache2 restart),后台进程就会被杀死。

无论如何我可以让进程在后台运行吗?

php apache background-process

5
推荐指数
1
解决办法
1162
查看次数

PHP在exec()bash脚本时挂起

我有一些看起来像这样的代码行...

exec($this->path.' start > /dev/null 2>&1 &');
return ['status' => 'Command executed'];
Run Code Online (Sandbox Code Playgroud)

$this->path是一个Shell脚本,start是该Shell脚本的一个参数,我相信该行的其余部分应该转储任何响应,以便php脚本可以继续运行。它无法正常运行,php成功启动了shell脚本(将启动游戏服务器),但是php一直挂起,直到我使用shell关闭服务器为止。当我使用外壳关闭服务器时,它完成了执行,并且收到了“命令已执行”响应。我还禁用了SELinux的执行,以确保它不会造成干扰。

运行Linux-Fedora 21和内置的PHP开发服务器。

php linux bash shell

5
推荐指数
1
解决办法
1124
查看次数

从 PHP 脚本运行 PHP 脚本的最佳实践是什么?

我会使用以下代码:

$SERVER_PATH = dirname(__FILE__);
shell_exec($PHP_LOCATION.' '.$SERVER_PATH."/script.php?k1=v1&k2=v2 > /dev/null 2>/dev/null &");
Run Code Online (Sandbox Code Playgroud)

在哪里:

  • $PHP_LOCATION应包含 PHP 的路径,

  • $SERVER_PATH- 是当前工作目录(幸运的是要运行的脚本位于同一目录中),

  • > /dev/null 2>/dev/null &添加以使此调用异步(取自Asynchronous shell exec in PHP Question)

这段代码有两个问题:

  1. 据我记得?k1=v1&k2=v2仅适用于网络调用,因此在这种特殊情况下参数不会传递给脚本。

  2. 我真的不知道如何初始化$PHP_LOCATION变量以使其灵活并在大多数主机上工作。

我对这两个问题进行了一些研究:

要解决1 ,建议使用-- 'parameters_string',但也建议修改脚本来解析参数字符串,这看起来有点笨拙。有更好的解决方案吗?

为了解决2,我找到了一个可以使用的解决方案PHP_BINARY,但这是一个 PHP 5.4+ 的情况(我使用的是 5.3)。但最初的问题是运行与原始脚本版本相同版本的 PHP。那么对我来说(因为我只使用 PHP 5.3)可能有解决方案吗?

编辑0

让我解释一下为什么我坚持这种奇怪的(对于 PHP)方法:

这些 PHP 脚本应该彼此分开:

  • 其中之一将分析数据并

  • 第二个将生成 PNG 图形作为最终结果。

这些脚本并不打算同时运行,这意味着第二个脚本可以按照自己的计划运行,只需要在其数据准备就绪时运行(由第一个脚本完成)。因此,不应将任何数据从第二个脚本(子脚本)传回第一个脚本(父脚本)。

编辑1

从大多数评论来看,主要讨论是分叉方向。不过,我想强调一下最初问题中提出的第 1点和第 2 点。我有一些理由按照我指出的方式解决任务,并且我试图指出所有这些原因。如果我的某些观点看起来很奇怪,请发表评论 - …

php linux shell-exec

5
推荐指数
1
解决办法
1007
查看次数

如何进行非阻塞的 php exec 调用?

我需要将文本回显到 Linux 中的命名管道 (FIFO)。即使我在后台运行 '&' 并将所有输出重定向到 /dev/null,shell_exec 调用总是阻塞。

互联网上几乎有很多关于这个问题的答案,它们基本上都指向以下 php 手册部分:

如果一个程序使用这个函数启动,为了让它在后台继续运行,程序的输出必须被重定向到一个文件或另一个输出流。如果不这样做,将导致 PHP 挂起,直到程序执行结束。

果然,当我使用 sleep 等其他命令尝试非阻塞方法(后台处理和重定向到 /dev/null)时,php 成功执行而不会挂起。但是对于向 FIFO 进行回显的情况,即使使用 bash 运行相同的命令产生不可见的输出并立即返回到 shell,php 也会挂起。

在 bash 中,我可以运行:

bash$ { echo yay > fifo & } &> /dev/null
bash$ cat fifo
yay
[1]+  Done                    echo yay > fifo
Run Code Online (Sandbox Code Playgroud)

但是当运行以下 php 文件时php echo.php

<?php
shell_exec("{ echo yay > fifo & } &> /dev/null");
?>
Run Code Online (Sandbox Code Playgroud)

它挂起,除非我首先打开 fifo 进行阅读。

所以我的问题是,为什么这会阻塞,而 sleep 不会?此外,我想知道幕后发生了什么:当我在 php 调用中放入 '&' 时,即使shell_exec调用阻塞,该echo调用也显然不会阻塞 php …

php bash

5
推荐指数
1
解决办法
1154
查看次数

用php在后台执行shell脚本

我需要执行一个shell脚本.抓住我想做到这一点

$Command = "nohup cvlc input --sout '#transcode {vcodec=h264,acodec=mp3,samplerate=44100}:std{access=http,mux=ffmpeg{mux=flv},dst=0.0.0.0:8083/".output"}' &";
$str = shell_exec($Command);
Run Code Online (Sandbox Code Playgroud)

我不希望它等到命令完成,我希望它在后台进程中运行.我不想要另一个php线程因为它会超时命令最多可能需要3个小时才能完成.

php linux shell

4
推荐指数
2
解决办法
1万
查看次数

运行第二个 php 文件,延迟 20 秒

我需要在后台运行第二个 php 文件。问题是这个文件只需要在当前文件完成后运行 20 秒。我已经使用 exec("php test_script.php") 来运行该文件,但我无法等待。如果我使用 sleep() 如果停止我当前的脚本。

更具体一点。我正在将文件上传到远程服务器。然后我需要在完成上传后等待大约 20 秒来检查服务器是否有响应。与此同时,我想继续处理当前的文件。第二个文件将在后台执行所需的操作。目前我必须等待然后运行第二个文件。

php exec delay background-process

4
推荐指数
1
解决办法
6285
查看次数

使用 php 启动 shell 脚本并退出它而不停止进程

我的问题可能有点复杂。

这是我的场景:

我想使用 php 启动 mjpg 流媒体。我的 php 脚本是:

<?php 
$output = shell_exec("sh /var/www/html/shellstart.sh");
echo "<pre>$output</pre>";
header("Location: ../index.php");
?>
Run Code Online (Sandbox Code Playgroud)

它在启动脚本时工作正常。问题是脚本

shellstart.sh:

LD_LIBRARY_PATH=/opt/mjpg-streamer/mjpg-streamer-experimental/ /opt/mjpg-streamer/mjpg-streamer-experime $
Run Code Online (Sandbox Code Playgroud)

启动一个进程并且 header() 函数永远不会被调用,因为它永远不会离开脚本。所以我正在寻找一种方法来启动脚本,让它保持运行但返回到 php 脚本并调用 header() 函数。

我已经试过了

trap "exit" SIGINT
Run Code Online (Sandbox Code Playgroud)

nohup LD_LIBRARY_PATH=/opt/mjpg-streamer/mjpg-streamer-experimental/ /opt/mjpg-streamer/mjpg-streamer-experime$
Run Code Online (Sandbox Code Playgroud)

我也试过 $ disown。但是当使用 nohup 或 $ disown 时,脚本甚至不会启动该过程。

我感谢任何帮助!提前致谢。

php shell

3
推荐指数
1
解决办法
1328
查看次数

检索文章最终URL和图像的最快捷有效的方法

我编写了一个PHP脚本来解析RSS提要并尝试从og:image meta标签中获取打开的图形图像.

为了获取图像,我需要检查RSS源中的URL是否为301重定向.这经常发生,这意味着我需要遵循任何重定向到结果URL.这意味着脚本运行得非常慢.是否有更快更有效的方法来实现这一目标?

以下是获取最终URL的功能:

function curl_get_contents($url) {
$agent= 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$result=curl_exec($ch);
return $result; 
}
Run Code Online (Sandbox Code Playgroud)

这是检索og图像的功能(如果存在):

function getog($url) {
    $doc = new DomDocument();
    $doc->loadHTML(curl_get_contents($url));
    if($doc == "") {return;}
    $xpath = new DOMXPath($doc);
    $query = '//*/meta[starts-with(@property, \'og:\')]';
    $queryT = '';
    $metas = $xpath->query($query);
    foreach ($metas as $meta) {
        $property = …
Run Code Online (Sandbox Code Playgroud)

php curl

2
推荐指数
1
解决办法
167
查看次数

异步运行PHP exec(),但检查完成?

我正在编写一个包含用户上传视频的网站后端.为了确保最大程度的可访问性,我正在压缩上传的视频,并将它们重新保存为.mp4和.webm格式,以涵盖所有浏览器(或者尽可能多的浏览器).为此,我在PHP exec()函数中运行avconv命令.

我不想让用户在页面加载之前等待脚本完成,所以我正在异步运行代码.到目前为止,我的代码如下.

exec('bash -c "exec nohup setsid avconv -i ' . $tempPath . ' -c:v libx264 ' . $transpose . ' ' . $newPath . 'mp4 > /dev/null 2>/dev/null &"');
exec('bash -c "exec nohup setsid avconv -i ' . $tempPath . ' -c:v libvpx ' . $transpose . ' ' . $newPath . 'webm > /dev/null 2>/dev/null &"');
Run Code Online (Sandbox Code Playgroud)

除了运行exec功能外,我还将视频保存到数据库并向用户发送电子邮件,感谢他们上传视频.

这就是问题:我希望服务器在视频转换完成之前等待,然后将其添加到数据库并向用户发送电子邮件.基本上,程序流程将是:

用户上传视频.视频放在临时文件夹中.用户被带到感谢页面,表明他们的视频很快就会播出.服务器执行两个avconv命令来转换和压缩视频以供Web使用.完成两次转换后,视频信息将添加到MySQL数据库,电子邮件将发送给用户,并删除原始上传的视频.

它可能只是我对命令行的无知(事实上它几乎肯定是),但我怎么能'排队'这些命令呢?首先进行两次转换,然后调用PHP脚本添加到数据库,然后删除原始视频,同时与原始PHP脚本异步?

编辑:我已尝试使用'&&'运算符排队,如下所示:

exec('bash -c "exec nohup setsid avconv -i ' . $tempPath . ' -c:v libx264 ' . …
Run Code Online (Sandbox Code Playgroud)

php video asynchronous ffmpeg avconv

1
推荐指数
1
解决办法
2870
查看次数

标签 统计

php ×11

linux ×3

shell ×3

background-process ×2

bash ×2

shell-exec ×2

apache ×1

asynchronous ×1

avconv ×1

curl ×1

delay ×1

exec ×1

ffmpeg ×1

video ×1