我正在尝试克隆一个 github 存储库并composer install在其上发出一个。但我得到了这个:
警告:锁定文件不是最新的 composer.json 中的最新更改。您可能会得到过时的依赖项。运行更新以更新它们。
Your requirements could not be resolved to an installable set of packages.
Problem 1
- Conclusion: remove symfony/polyfill-intl-icu v1.9.0
- Installation request for symfony/polyfill-intl-icu v1.9.0 -> satisfiable by symfony/polyfill-intl-icu[v1.9.0].
- Conclusion: remove symfony/process v3.4.15
- symfony/polyfill-intl-icu v1.9.0 requires symfony/intl ~2.3|~3.0|~4.0 -> satisfiable by symfony/symfony[v4.0.0].
- don't install symfony/process v3.4.15|remove symfony/symfony v4.0.0
- don't install symfony/symfony v4.0.0|don't install symfony/process v3.4.15
- Installation request for symfony/process v3.4.15 -> satisfiable by symfony/process[v3.4.15].
Run Code Online (Sandbox Code Playgroud)
跑步时 composer …
对于耗时的任务(电子邮件发送,图像处理......你明白了),我想运行异步PHP任务.
在Linux上这很容易,但我正在寻找一种适用于Windows的方法.
我希望它变得简单,应该如此.没有火炮,没有SQL排队,没有一次又一次地安装东西 ......我只想运行一个该死的异步任务.
所以我尝试了Symfony Process Component.问题是,同步运行任务工作正常,但在异步运行时,它会沿主脚本退出.
有没有办法来解决这个问题?
composer require symfony/process
Run Code Online (Sandbox Code Playgroud)
的index.php
<?php
require './bootstrap.php';
$logFile = './log.txt';
file_put_contents($logFile, '');
append($logFile, 'script (A) : '.timestamp());
$process = new Process('php subscript.php');
$process->start(); // async, subscript exits prematurely…
//$process->run(); // sync, works fine
append($logFile, 'script (B) : '.timestamp());
Run Code Online (Sandbox Code Playgroud)
subscript.php
<?php
require './bootstrap.php';
$logFile = './log.txt';
//ignore_user_abort(true); // doesn't solve issue…
append($logFile, 'subscript (A) : '.timestamp());
sleep(2);
append($logFile, 'subscript (B) : '.timestamp());
Run Code Online (Sandbox Code Playgroud)
bootstrap.php中
<?php
require …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
$process = new Process('vi');
try {
$process->setPty(true);
$process->mustRun(function ($type, $buffer) {
echo $buffer;
});
//echo $process->getOutput();
} catch (ProcessFailedException $e) {
echo $e->getMessage();
}
但是,它通过以下信息为我而死:
The command "vi" failed. Exit Code: 1(General error) Working directory: [path] Output: ================ Vim: Error reading input, exiting... Vim: Finished. Error Output: ================ Vim: Warning: Output is not to a terminal Vim: Warning: Input is not from a terminal
UPDATE
似乎某些人不清楚我将要做什么.我会解释.此脚本正在控制台中运行.同样的事情通过passthru工作(虽然Vim仍然警告输出).我希望有一个交互式进程,允许用户在发送某个文件之前修改它.我不想实现自己的编辑器,这就是我希望他们使用vi的原因.vi在我的服务器上可用(从我提供的输出中可以清楚地看到).
我试图通过使用ssh-add向其添加新密钥来控制系统ssh-agent.为此我正在使用Symfony Process组件.
当我从一个网站运行这个代码时它工作得很好但是当我在shell/console中运行相同的代码时,ssh-add进程挂起 Enter passphrase for <path to key>:
代码的简化版本看起来像这样
use Symfony\Component\Process\Process;
$keyPath = '<path to key>';
$keyPassword = '<password for unlocking the key>';
$socketPath = '<path to ssh-agent socket>';
$sshAdd = new Process(
"ssh-add {$keyPath}",
null,
[
'SSH_AUTH_SOCK' => $socketPath
],
$keyPassword
);
$sshAdd->run();
Run Code Online (Sandbox Code Playgroud)
正如您在上面的代码中看到的那样,我打电话给ssh-add,SSH_AUTH_SOCK在环境中设置,以便ssh-add与代理交谈,然后在输入中发送密码.正如我之前所说,当我在Web上下文中运行它时,它可以工作但它挂在shell /控制台上下文中.
我strace在控制台中运行时做了一个,相关部分看起来像这样
open("<path to key>", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
write(4, "<key password>", <length of password>) = 20
close(4) = 0 …Run Code Online (Sandbox Code Playgroud) 我在某些机器上从 Symfony 进程命令获得退出代码 -1,而完全相同的代码返回退出代码 0,而在其他机器上除外。在这两种情况下,给定命令的输出都成功执行。
从 shell 运行相同的命令行会给出正确的退出代码 (0)。我制作了一个小测试用例来重现这个问题:
use Symfony\Component\Process\Process;
$process = new Process('./console');
$process->run();
echo $process->getExitCode();
Run Code Online (Sandbox Code Playgroud)
关于如何诊断这个的任何想法?
我为我的 symfony2 项目创建了一个控制台命令,我想从控制器执行它而不阻塞控制器输出(在后台)。
通常是这样执行的:
$application = new Application($kernel);
$application->setAutoExit(true);
// AppBundle/Command/UpdateStockCommand.php
$input = new ArrayInput(array(
'command' => 'update:stock',
));
$output = new NullOutput();
$application->run($input, $output);
Run Code Online (Sandbox Code Playgroud)
但是像这样运行,用户将不得不等待任务完成,这可能需要几分钟。
一个解决办法是:
$kernel = $this->get('kernel');
$process = new \Symfony\Component\Process\Process('nohup php '. $kernel->getRootDir() .'/console update:stock --env='. $kernel->getEnvironment() .' > /dev/null 2>&1 &');
//$process->start();
$process->run();
Run Code Online (Sandbox Code Playgroud)
没有给出错误,控制器呈现输出,但不执行任务。
另一种解决方案是:
exec('/usr/bin/php '.$this->get('kernel')->getRootDir().'/console update:stock --env=dev > /dev/null 2>&1 &');
Run Code Online (Sandbox Code Playgroud)
在此处找到Symfony2 - 进程启动 symfony2 命令, 但不适用于我的示例。
在一个新的symfony2项目(这里描述的安装)中,我想作为请求的一部分启动一个控制台进程.该应用程序在nginx + php-fpm的"标准"ubuntu 14.04框上运行.
考虑一下这个控制器代码:
<?php
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Process\Process;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
class CommandController extends Controller
{
/**
* @Route("/command")
* @return JsonResponse
*/
public function commandAction ()
{
$rootDir = $this->get('kernel')->getRootDir();
$env = $this->get('kernel')->getEnvironment();
$commandline = $rootDir . '/console --env=' . $env . ' acme:hello --who jojo'
$process = new Process($commandline);
$process->start();
return new JsonResponse(array('command' => $commandline));
}
}
Run Code Online (Sandbox Code Playgroud)
当我向/ command发出请求时,我得到了我期望的结果并且该过程开始,例如我用htop等看到它.当我再次发出此请求时,我得到了我的预期结果,但是要启动的过程不会出现在任何地方.没有错误,没有任何错误.
重新启动php5-fpm服务使我能够再次通过请求启动一个进程,所以基本上我需要在每次请求后重新启动整个php服务.所以这可能不是编程问题.但老实说,我还不知道.问题是在stackoverflow之前描述的,Symfony2 - 进程启动一个symfony2命令,但exec的解决方法对我不起作用.
有人有线索吗?
谢谢,问候,jojo
我们已经使用了libreoffice --headless一段时间,首先是通过 Debian,在过去的几个月里我们切换到了 CentOS。我们使用Symfony Process命令将 a 转换docx为pdf,简化的命令如下所示:
libreoffice --headless --convert-to pdf \
--outdir /home/conversionoutdir \
/home/conversionindir/4f00ac05aee274967b.docx
Run Code Online (Sandbox Code Playgroud)
执行上述命令的 Symfony 进程非常简单:
$process = new Process($cmd);
$process->mustRun();
Run Code Online (Sandbox Code Playgroud)
一切都工作正常,但几天后转换不再完成,该过程将一直等待,直到达到 60 秒超时。
一直在通过在我们的服务器上执行完全相同的转换来调试此问题DEV,一切都很好。还尝试转换小文档和大文档,以查看页数对于达到超时的影响。还直接在命令行上执行命令,转换也可以,并在几秒钟内完成。
我们的应用程序捕获异常,并将其发送到记录器:
进程 \"/usr/bin/libreoffice --headless --nologo --nofirststartwizard --norestore --convert-to pdf:writer_web_pdf_Export --outdir /home/conversionoutdir /home/conversionindir/4f00ac05aee274967b.docx\" 超出超时60 秒。
看来 PHP 无法再跟踪进程了。这里可能发生了什么?关于如何进一步调试这个的任何线索?
编辑:在抽象出 Symfony 进程组件、将conversionoutdir权限设置为 777 并执行以下代码片段后,如果从 PHP 执行,转换仍然会挂起:
$output = array();
exec('libreoffice --headless --convert-to pdf \
--outdir /home/conversionoutdir \
/home/conversionindir/4f00ac05aee274967b.docx', $output);
print_r($output);
Run Code Online (Sandbox Code Playgroud) 我正在将旧的 Symfony 应用程序 (v2.8) 升级到 Symfony 5.3。我正在使用进程组件,其中参数必须以不同于以前的方式传递。
我以前的代码就像
use Symfony\Component\Process\Process;
$cmd = sprintf('mysqldump mydatabase > %s', $outputTarget);
$process = new Process($cmd);
$process->run();
Run Code Online (Sandbox Code Playgroud)
现在,Symfony 的 Process 构造函数期望将二进制文件和参数作为数组传递(请参阅此处)。
如何实现新样式的输出重定向?
$process = new Process(['mysqldump', 'mydatabase', '>', $outputTarget]);
$process->run();
Run Code Online (Sandbox Code Playgroud)
不会起作用,因为>会被转义。
我的Symfony 2.3项目中有一个类正在执行一些http请求并需要一些时间.
我想将此任务作为后台进程运行,以便服务器返回客户端的答案,后台进程继续运行.
你知道如何在Symfony做到这一点吗?
我找到了Process组件:http://symfony.com/doc/current/components/process.html但我不确定我是否可以从那里运行类方法.
我正在启动一个长时间运行的任务,该任务使用 Symfony Process 组件返回有关任务进度的增量输出。
其中一个示例显示了如何获取实时输出,另一个示例显示了如何运行异步任务。
我想要实现的是将 getIncrementalOutput 的结果传递回 ajax 轮询函数,以便我可以实时更新前端。
似乎在任何一种情况下 process->start() 都被阻塞,因为我的 ajax 调用需要一分钟才能返回,到那时任务已经完成。
我想我试图避免将进度写入数据库或文件并直接从正在运行的 PHP 任务中获取输出。
不确定是否有可能。
我正在尝试使用 Symfony 进程组件执行 ffmpeg 命令,但命令未被处理。我究竟做错了什么?我收到错误
命令“'ffmpeg -i [.........]'失败。退出代码:127(未找到命令)”
<?php
$info = pathinfo($file);
$dir = "{$info['dirname']}/{$info['filename']}";
File::makeDirectory($dir, 0755, true)
$process = new Process(["ffmpeg -i {$info['basename']} -codec copy -map 0 -f segment -segment_list {$dir}/playlist.m3u8 -segment_list_flags +live -segment_time 10 {$dir}/{$info['filename']}_%02d.ts"]);
$process->setWorkingDirectory($info['dirname']);
$process->start();
if (!$process->isSuccessful()) {
throw new ProcessFailedException($process);
}
echo $process->getOutput();
?>
Run Code Online (Sandbox Code Playgroud) symfony ×12
symfony-process ×12
php ×8
process ×3
ajax ×1
asynchronous ×1
background ×1
composer-php ×1
libreoffice ×1
nginx ×1
shell ×1
symfony4 ×1
symfony5 ×1
windows ×1