非阻塞命名管道

非阻塞命名管道

问题描述:

问题摘要:我已经成功地加速了大幅上传图片时的图片缩略图,代价是使用并发。现在我需要确保针对竞争条件的并发性。我打算让独立脚本为独立状态轮询正常文件,但后来决定命名管道会更好。管道避免轮询并命名,因为我无法从打开它们的脚本中获得PID(这是我需要使用管道进行交谈的那个)。非阻塞命名管道

所以当一个图像上传时,客户端通过AJAX发送POST到一个脚本1)保存图像2)产生一个并行脚本(独立)拇指图像和3)返回图像的JSON到客户端。然后,客户立即请求翻译版本,我们希望有足够的时间在响应发送时做好准备。但是,如果它没有准备好,Apache mod_将路径指向第二个脚本(依赖项),该脚本将等待拇指完成并返回图像数据。

我预计这是非常简单的,但是,同时通过终端单独测试独立的脚本,我得到这个:

$ php -f thumb.php -- img=3g1pad.jpg 
successSegmentation fault 

源是在这里:http://codepad.org/JP9wkuba我怀疑我得到一个段错误,因为FIFO我做了仍然是开放的,现在成了孤儿。但我需要在那里为依赖脚本来看,对吧?并不是它应该是非阻塞的?我想这是因为脚本的其余部分可以运行....但它不能完成?这将是一个正常文件的工作,正如我一开始就想到的,除非两者都是开放的,我不想投票。我想最多进行一次轮询并完成它。我是否需要投票并忽略丑陋?

+3

我意识到这不会直接回答你的问题,但你为什么选择这个*令人难以置信的奇怪的路线,而不是使用像Gearman这样的工作/消息队列(http://gearman.org/)? – Charles 2011-03-15 20:33:14

+0

@Charles:嗯,我听说过,但不知道它做了什么。但我现在真的不需要另一个API来学习。 – Grault 2011-03-15 21:41:43

+8

你需要担心的2-4个方法与挖掘你自己发现的crashtastic命名管道泥潭所需的努力相比是微不足道的。:) Gearman甚至可以让你[发送状态数据回来而处理](http://www.php.net/manual/en/gearmanjob.sendstatus.php),你似乎有一个很好的例子在这里。 (发送状态信息实际上显着增加了作业检索过程的复杂性 - 它从火再遗忘/火灾等待到处理火焰和回火的标志。) – Charles 2011-03-15 22:39:35

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