0

我有 2 个简短的脚本。第一个是 awk 脚本,处理一个大文件并打印到命名管道“myfifo.dat”。第二个是 Perl 脚本,它运行一个LOAD DATA LOCAL INFILE 'myfifo.dat'...命令。这两个脚本在本地运行时都可以工作,如下所示:

lee.awk big.file &
lee.pl

但是,当我从 PHP 网页调用这些脚本时,命名管道会阻塞:

$awk="/path/to/lee.awk {$_FILES['uploadfile']['tmp_name']} &";
$sql="/path/to/lee.pl";

if(!exec($awk,$return,$err)) throw new ZException(print_r($err,true)); //blocks here
if(!exec($sql,$return,$err)) throw new ZException(print_r($err,true));

如果我修改 awk 和 Perl 脚本,以便它们写入和读取普通文件,那么 PHP 一切正常。fifo 和普通文件的权限为 666(用于测试目的)。这些操作通过命名管道运行得更快,所以我更喜欢使用一个。任何想法如何解锁它?

附言。如果您想知道为什么我要让所有这些恶化,请参阅这个 SO question

4

1 回答 1

1

您可能知道,当您打开命名管道进行写入时,您将阻塞,直到其他人打开它进行读取。我认为这就是为什么您在第一个 exec() 调用中的命令行末尾有“&”的原因。

但是 PHP 尊重这种语法吗?我不是 PHP 专家,但如果这不是在子进程完成执行之前让 PHP exec() 返回的正确方法,那么两个 exec() 调用将被序列化,这将完全解释这种阻塞行为。

于 2010-03-30T11:23:34.420 回答