非阻塞命名管道

7
问题概述:我已经成功地通过使用并发来大幅加快了图像上传时的拇指速度,但这样做需要牺牲一些性能。现在我需要保护并发性以避免竞争条件。我原本想让依赖脚本轮询普通文件以获取独立文件的状态,但后来决定使用命名管道更好。使用管道可以避免轮询,而使用命名管道是因为我无法从打开它们的脚本中获取PID(我需要用管道与该脚本通信)。
因此,当上传图像时,客户端通过AJAX向一个脚本发送POST请求,该脚本1)保存图像2)生成一个并行脚本(独立脚本)来制作缩略图3)返回有关图像的JSON数据给客户端。然后客户端立即请求缩略版本,我们希望在响应被发送时有足够的时间准备好它。但如果没有准备好,Apache mod_rewrite将路径重写为指向第二个脚本(依赖脚本),该脚本等待缩略完成,然后返回图像数据。
我本来以为这很简单,但是,在通过终端测试独立脚本时,我得到了以下结果:
$ php -f thumb.php -- img=3g1pad.jpg
successSegmentation fault

源代码在这里:http://codepad.org/JP9wkuba我怀疑是因为我创建的fifo仍然处于打开状态并且变成孤儿进程导致了segfault。但我需要它在那里,以便其他脚本可以看到,对吗?它不应该是非阻塞的吗?我想它是非阻塞的,因为脚本的其余部分可以运行...但是它不能完成吗?开始时这将是普通文件的工作,除非两个都打开,否则我不想进行轮询。我想最多只需轮询一次并完成它。我只需要轮询并忽略不美观的东西吗?

3
我会尽力为您翻译,以下是内容:我知道这不是你问题的直接答案,但是你为什么选择这种极其奇怪的方式,而不是使用像Gearman这样的工作/消息队列呢? - Charles
@Charles:嗯,我听说过那个,但不知道具体是做什么的。但目前我真的不需要再学习另一个 API。 - Grault
8
相较于从你所陷入的命名管道困境中解脱出来所需付出的努力,你需要担心的2-4种方法非常容易学习。Gearman甚至让你可以在处理过程中发送状态数据回来,对于这里的情况,你似乎有一个很好的理由去这么做。(实际上,发送状态信息会显著增加作业检索过程的复杂性——它从“发送并忘记”/“发送并等待”变成了“发送并在处理标志时循环”。) - Charles
1
同意,值得一看的是gearman,或者对你来说php-resque可能会更简单一些(我都用过并且取得了不错的成果) - Ian Selby
@Charles,为什么不把你的评论变成答案呢?我看它已经得到了足够高的评分;) - Vladislav Rastrusny
2
@FractalizeR,我发现“不要那样做,你疯了”并不总是一个实际的答案,尽管在这种情况下它是合适的。我可能会考虑转换成一个答案。 - Charles
1个回答

1

你需要删除创建的FIFO文件,然后完成所有脚本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接