PHP shell_exec在一段时间后返回空字符串



我制作了一个Symfony控制台命令,该命令使用pngquant来处理和压缩一长串图像。图像是从CSV文件中读取的。

批处理在本地环境中工作良好,直到结束,但在后台环境中,它工作约5分钟然后开始从shell_exec命令返回空结果。我甚至做了一个重试系统,但它总是返回空结果:

// escapeshellarg() makes this safe to use with any path
// errors are redirected to standard output
$command = sprintf(
'%s --quality %d-%d --output %s --force %s 2>&1',
$this->pngquantBinary,
$minQuality,
$maxQuality,
escapeshellarg($tempPath),
$path
);
// tries a few times
$data    = null;
$attempt = 0;
do {
// command result
$data = shell_exec($command);
// error
if (null !== $data) {
$this->logger->warning('An error occurred while compressing the image with pngquant', [
'command' => $command,
'output'  => $data,
'cpu'     => sys_getloadavg(),
'attempt' => $attempt + 1,
'sleep'   => self::SLEEP_BETWEEN_ATTEMPTS,
]);
sleep(self::SLEEP_BETWEEN_ATTEMPTS);
}
++$attempt;
} while ($attempt < self::MAX_NUMBER_OF_ATTEMPTS && null !== $data);
// verifies that the command has finished successfully
if (null !== $data) {
throw new Exception(sprintf('There was an error compressing the file with command "%s": %s.', $command, $data));
}

问题是在同一环境中的另一个shell中执行的同一命令运行良好!我的意思是,当我记录错误时,如果我在同一服务器上的另一个实例中放入完全相同的命令,效果会很好。

即使从Symfony日志中,我也无法读取任何错误,我应该在哪里查找更详细的错误?

是什么原因造成的?执行过程中内存和处理器都很好!

经过多次尝试,我读到了这个问题:

Symfony2流程组件-无法创建管道并启动新流程

解决方案是在循环期间的刷新之后添加对gc_collect_cycles的调用!

if ($flush || 0 === ($index % self::BATCH_SIZE)) {
$this->em->flush();
$this->em->clear();
// clears the temp directory after flushing
foreach ($this->tempImages as $tempImage) {
unlink($tempImage);
}
$this->tempImages = [];
// forces collection of any existing garbage cycles
gc_collect_cycles();
}

重要信息:还要注意磁盘索引节点的数量

df -i
Filesystem      Inodes   IUsed  IFree IUse% Mounted on
udev            125193     392 124801    1% /dev
tmpfs           127004     964 126040    1% /run
/dev/vda2      5886720 5831604  55116  100% /

最新更新