2012-05-13 32 views
3

这有点复杂,所以请不要跳到结论,随意问任何不够清楚的事情。PHP线程和高延迟文件访问(例如:FTP)

基本上,我有一个用PHP编写的websocket服务器。请注意,websocket消息是异步的,也就是说,在客户端继续工作时(如果适用),对请求的响应可能需要很长时间。

客户端应该要求服务器访问其他服务器上的文件。这可以是FTP服务或Dropbox。

在这里,请采取两种问题注意:应连接共享和重用服务器实际上“冻结”,同时完成其工作,因此,任何请求进行处理后,服务器有“解冻”。

因此,我想,为什么不卸载文件访问(这是冻结服务器)到PHP threads

这里的问题是双重的;

  • 如何在子线程可用的主线程(服务器)中创建连接资源(对于上述线程模型不可能)?
  • 如果两个线程最终需要相同的资源会发生什么?如果一个人被锁定,直到另一个人完成,这很好,但我们仍然需要弄清问题#1。

也许我的思路全部搞砸了,如果你能找到更好的解决方案,我很想听到它。我也有过一个拥有连接资源的PHP线程的想法,但它的内存密集。

+1

您可能可以在PHP中使用它,但我可能会建议使用另一种服务器端技术(如Node.JS),或者以更直接的方式实际支持多线程的东西。如果你使用Node路由,你不必实际编写任何线程代码......它通过在单个线程中运行你的代码,但在幕后以多线程方式处理IO,它可以为你工作。当然,你仍然有一个维护连接池到外部资源的问题,但是至少你的代码能够在不通过IPC的情况下看到该池。 – Brad

+0

很久以前我就曾想过Node.js,它既没有帮助,也没有减少我的事业的任何代码。事实上,它增加了维护,并减少了服务器提供商的选择(不,我不需要一个花哨的云提供商为这样一个小小的个人应用程序)。 – Christian

+0

我还有另一个问题,它会应用于node.js,只是相同;我将如何共享不同线程之间的连接? – Christian

回答

5

PHP不支持线程。 PHP的目的是快速响应Web请求。这就是架构的目的。不同的图书馆试图做类似线索的事情,但它们通常会导致比解决问题更多的问题。

一般有两种方式来实现你想要什么:

+0

我会检查出齿轮工,希望它不会与phpthreadlib有相同的限制关于异步操作;问题在于他们错过了某些关键方面,例如,没有办法使'ftp_rawlist()'异步。 – Christian