这有点复杂,所以请不要妄下结论,有什么不够清楚的地方可以问。
基本上,我有一个用 PHP 编写的 websocket 服务器。请注意,websocket 消息是异步的,也就是说,对请求的响应可能需要很长时间,而客户端一直在工作(如果适用)。
客户端应该向服务器请求访问其他服务器上的文件。就此而言,这可以是 FTP 服务或 Dropbox。
在这里,请注意两个问题:应该共享和重用连接和服务器在执行其工作时实际上“卡住”,因此任何请求都会被处理在服务器“解冻”之后。
因此,我想,为什么不将文件访问(这会卡住服务器)卸载到 PHP threads ?
这里的问题是双重的;
- 如何使主线程(服务器)中的连接资源可供子线程使用(上述线程模型不可能)?
- 如果两个线程最终需要相同的资源会怎样?如果一个在另一个完成之前被锁定,那很好,但我们仍然需要解决问题 #1。
也许我的思路全搞砸了,如果你能找到更好的解决方案,我很想听听。我也有过让 PHP 线程托管连接资源的想法,但它非常占用内存。
最佳答案
PHP 不支持线程。 PHP 的目的是快速响应网络请求。这就是构建架构的目的。不同的库尝试做线程之类的事情,但它们通常导致的问题多于解决的问题。
一般来说有两种方法可以达到你想要的效果:
- 将长流程卸载到外部流程。一种常见的方法是使用像 gearman 这样的系统 http://php.net/gearman
- 使用异步操作。一些流操作等提供“异步”标志或“非阻塞”模式。 http://php.net/stream-set-blocking
关于PHP 线程和高延迟文件访问(例如;FTP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10575974/