2012-04-12 147 views
0

我写的php脚本通过unix本地套接字与服务器通信。 1)连接 2)socket_write()(90%的时间低大小的块,10%的大尺寸) 3发送MSG)得到的答案 4)紧密连接php socket_write通过阻塞和非阻塞套接字

现在,我有简单的socket_write( )实现像comments from php manual“jean at briskula dot si 03-Feb-2011 03:00”

似乎它的工作正常阻塞模式,但我想实现socket_write的超时,因此我认为(需要)使用非阻塞模式,当调用socket_write()时。

阻塞模式优于非阻塞吗? 是否有理由实现超时? 如何正确实现它们? 任何示例?

试图写一个while循环,但得到=== FALSE,可能需要socket_select()每次在socket_write()调用之前?

ps。当从服务器读取答案时,这个问题同样适用于socket_read()

回答

1

对于通过套接字向后端系统发送数据/接收来自后端系统的数据的PHP(面向网络)脚本,而没有其他处理的机会(这是基本上为什么你想首先使用非阻塞模式),处理非阻塞模式导致的复杂性是没有意义的。

所以,坚持阻塞模式。

+0

谢谢,但我能做些什么,可以发生的情况下,因为某些原因请求将长(无限),这将阻止c + +服务器的线程?我觉得某处需要添加超时...也许在C++端,但是如何? SO_LINGER? – abrahab 2012-04-12 11:18:29

+1

如果你担心的是C++端,那么使用非阻塞套接字来查询数据,实现某种形式的超时。这个答案只是指等式的面向PHP的一面。为了正确使用非阻塞I/O,请查看http://stackoverflow.com/questions/6715736/using-select-for-non-blocking-sockets。 – modelnine 2012-04-12 13:32:16

+0

感谢,仍然保持现状,因为解决方案与选择()是不好的,需要重写所有线程逻辑在现有的程序。也许在该功能将被读取一些关于整个套接字超时。在我看来,SO_LINGER对此负责。并冻结线程recv或发送永远不会永远阻止。 – abrahab 2012-04-12 18:41:06