问题概述:我已经成功地通过使用并发来大幅加快了图像上传时的拇指速度,但这样做需要牺牲一些性能。现在我需要保护并发性以避免竞争条件。我原本想让依赖脚本轮询普通文件以获取独立文件的状态,但后来决定使用命名管道更好。使用管道可以避免轮询,而使用命名管道是因为我无法从打开它们的脚本中获取PID(我需要用管道与该脚本通信)。
因此,当上传图像时,客户端通过AJAX向一个脚本发送POST请求,该脚本1)保存图像2)生成一个并行脚本(独立脚本)来制作缩略图3)返回有关图像的JSON数据给客户端。然后客户端立即请求缩略版本,我们希望在响应被发送时有足够的时间准备好它。但如果没有准备好,Apache mod_rewrite将路径重写为指向第二个脚本(依赖脚本),该脚本等待缩略完成,然后返回图像数据。
我本来以为这很简单,但是,在通过终端测试独立脚本时,我得到了以下结果:
源代码在这里:http://codepad.org/JP9wkuba我怀疑是因为我创建的fifo仍然处于打开状态并且变成孤儿进程导致了segfault。但我需要它在那里,以便其他脚本可以看到,对吗?它不应该是非阻塞的吗?我想它是非阻塞的,因为脚本的其余部分可以运行...但是它不能完成吗?开始时这将是普通文件的工作,除非两个都打开,否则我不想进行轮询。我想最多只需轮询一次并完成它。我只需要轮询并忽略不美观的东西吗?
因此,当上传图像时,客户端通过AJAX向一个脚本发送POST请求,该脚本1)保存图像2)生成一个并行脚本(独立脚本)来制作缩略图3)返回有关图像的JSON数据给客户端。然后客户端立即请求缩略版本,我们希望在响应被发送时有足够的时间准备好它。但如果没有准备好,Apache mod_rewrite将路径重写为指向第二个脚本(依赖脚本),该脚本等待缩略完成,然后返回图像数据。
我本来以为这很简单,但是,在通过终端测试独立脚本时,我得到了以下结果:
$ php -f thumb.php -- img=3g1pad.jpg
successSegmentation fault
源代码在这里:http://codepad.org/JP9wkuba我怀疑是因为我创建的fifo仍然处于打开状态并且变成孤儿进程导致了segfault。但我需要它在那里,以便其他脚本可以看到,对吗?它不应该是非阻塞的吗?我想它是非阻塞的,因为脚本的其余部分可以运行...但是它不能完成吗?开始时这将是普通文件的工作,除非两个都打开,否则我不想进行轮询。我想最多只需轮询一次并完成它。我只需要轮询并忽略不美观的东西吗?