问题:
服务器A有大量数据,要持续的发给服务器B。为减小资源消耗,要求长连接,即只建立一次连接,然后不停的发数据。
我之前是这么实现的:
http://topic.csdn.net/u/20100824/17/8be4d53d-9509-4e8b-8ce2-447556fe3ea4.html
只用一次fsockopen,然后不停的发数据。但我使用后发现,发送太快,B服务器根本不能及时处理,会发生丢数据现象。
如果加上fgets,等响应后再发下一次数据,但客户端只能接受到一次请求,好像因为读到feof($fp)后,连接就断了,没办法发下一次数据。欢迎高手讨论或提供解决方案,谢谢!

解决方案 »

  1.   

    要实现长连接必需要保证PHP脚本一直运行,但是实际上PHP脚本在处理完Web的请求后就关闭了,socket连接也就随之关闭了。
    网上有人说用php的命令行来保证php脚本持续运行,但是这存在一个问题,php实际上没有对多线程的支持。php命令脚本能持续运行,但是他没法接收web客户端的请求。
    所以,不知道你的原始需求是什么,但是用php来实现长时间大量发送数据不是一个好主意。这个帖子对这个问题讨论得挺详细的,尤其是第二页一开始的那个大侠的回复。
    http://bbs.phpchina.com/viewthread.php?tid=4577&extra=&page=1
      

  2.   

    你对socket的理解有问题.
    1. keep alive是正确的
    2. 头只用发送一次就好了,在发送的时候记住要告诉对方服务器总长.
    3. fsockopn之后,得到socket句柄,那个就好像本地文件一样,直接循环fwrite,每次发送一点就可以了.
    4. 用完了fclose另外,如果只是解决问题你可以反着做,你将要发送的数据写成一个临时文件,然后通知对端来取也一样.ps: 1楼的回答是错的,php有选项控制,问问google就知道了
      

  3.   

    我搜到这个文章
    http://blog.developers.api.sina.com.cn/?paged=30
    感觉有些道理,回头去试试
    pfsockopen
      

  4.   

    php 多线程(子进程)实现可以看这两篇, 用pcntl
    http://blog.csdn.net/lgg201/archive/2010/08/13/5810028.aspx
    http://blog.csdn.net/lgg201/archive/2010/08/13/5809994.aspx