免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5794 | 回复: 9
打印 上一主题 下一主题

[原创]PHP与外部服务器的持久连接 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-01 22:20 |只看该作者 |倒序浏览
博客地址: http://lajabs.net/?p=373

php做为脚本语言,有时也有特殊的需求对外连接到其它服务器发送消息,简单的方法可以直接使用socket扩展,比如连接一个TCP服务器:

  1. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  2. if($socket)
  3. {
  4.   socket_connect($socket, '127.0.0.1', 8081);
  5.   $pack = 'hello.'; //发送的内容
  6.   socket_send($socket, $pack, strlen($pack), 0);
  7.   socket_recv($socket, $buffer, 1024, 0);
  8.   echo $buffer; //接收的内容
  9. }
复制代码
这些socket功能已经可以满足大多数对外连接的需要了,但面对一些连接特别频繁的环境就显得有些力不从心,系统频繁地建立和销毁连接的开销是很大的,这时需要一种持久连接,说到持久连接,很多人可能会马上想到mysql_pconnect这类函数(有点谈虎色变),由于PHP的运行机制造成持久连接一直有着这样那样的问题(不细谈),其实对于目前高版本的PHP,启用php-fpm运行在fast-cgi下
的持久连接使用还是比较理想的。

php很早就提供了一个这样的函数:pfsockopen,可能更多人对于fsockopen更了解,而使用上则大同小异。

简单地用例子说明:

  1. $socket = pfsockopen('127.0.0.1',8081,$errno, $errstr);
  2. if($socket)
  3. {
  4.   $pack = 'hello.';
  5.   fwrite($socket, $pack);  //fput 、fget
  6.   $buffer = fread($socket, 1024);
  7.   echo $buffer;
  8. }
复制代码
php建立了一个和目标服务器8081端口连接,当PHP脚本执行完成后不会断开连接,并在下一次脚本运行时重新使用这个连接,
使用php-fpm环境下会建立与其进程数相同的连接数,这样就类似形成一个“连接池”。

论坛徽章:
0
2 [报告]
发表于 2011-07-02 00:25 |只看该作者
关于socket你提到的写法已经out了。。。

参见 stream 相关的函数,那才叫猛,而且不需要额外的扩展,可控性也很强,还能异步连接呢。

stream_socket_server(), stream_socket_client() ...

论坛徽章:
0
3 [报告]
发表于 2011-07-02 09:17 |只看该作者
关于socket你提到的写法已经out了。。。

参见 stream 相关的函数,那才叫猛,而且不需要额外的扩展,可控 ...
hightman 发表于 2011-07-02 00:25



   
果然很猛,见识了

论坛徽章:
7
寅虎
日期:2014-08-15 12:54:11狮子座
日期:2014-10-28 23:42:142015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:00IT运维版块每日发帖之星
日期:2015-08-04 06:20:00IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-10-10 06:20:00
4 [报告]
发表于 2011-07-03 14:25 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2011-07-04 17:08 |只看该作者
web service的服务器端还是apache好,客户端就由不得你了。js, curl. 啥都可以,谁叫他是客户端呢?

论坛徽章:
7
寅虎
日期:2014-08-15 12:54:11狮子座
日期:2014-10-28 23:42:142015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:00IT运维版块每日发帖之星
日期:2015-08-04 06:20:00IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-10-10 06:20:00
6 [报告]
发表于 2011-07-05 20:13 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2011-07-05 21:01 |只看该作者
没用过。  curl实现很方便,干嘛要stream?
另外 zend freamwork 里面有现成的 client, 比如  xmlrpc_client, rest_client
都封装好了,干嘛还要去发明轮子?

论坛徽章:
0
8 [报告]
发表于 2011-07-05 22:07 |只看该作者
方便不方便不一定,看自己喜好和应用情况,摘自手册

  1. <?php
  2. // Create a stream
  3. $opts = array(
  4.   'http'=>array(
  5.     'method'=>"GET",
  6.     'header'=>"Accept-language: en\r\n" .
  7.               "Cookie: foo=bar\r\n"
  8.   )
  9. );

  10. $context = stream_context_create($opts);

  11. // Open the file using the HTTP headers set above
  12. $file = file_get_contents('http://www.example.com/', false, $context);
  13. ?>
复制代码

论坛徽章:
7
寅虎
日期:2014-08-15 12:54:11狮子座
日期:2014-10-28 23:42:142015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:00IT运维版块每日发帖之星
日期:2015-08-04 06:20:00IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-10-10 06:20:00
9 [报告]
发表于 2011-07-06 10:55 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
10 [报告]
发表于 2011-07-06 14:48 |只看该作者
stream_socket_server 确实挺方便的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP