Chinaunix首页 | 论坛 | 博客
  • 博客访问: 322712
  • 博文数量: 96
  • 博客积分: 230
  • 博客等级: 二等列兵
  • 技术积分: 722
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-13 22:25
个人简介

心安处即吾乡!

文章分类

全部博文(96)

文章存档

2016年(1)

2014年(79)

2013年(7)

2012年(9)

我的朋友

分类: PHP

2014-06-20 16:13:58

用途: 当业务需要调用一个比较耗时外部资源时使用, 最常见的是从外部API获取相关内容或者执行一条比较耗时的外部命令
使用方法:
1. 建立外部资源脚本。 如示例中使用test.sh。 当然, 也可以直接使用curl等命令行
2. 准备好参数, 提供给pipe脚本
2. 使用popen调用脚本。 调用之后,就不用关心了。
3. 开始其他的和pipe不相关的逻辑处理
4. 其他处理完成之后, 使用fgets等方式,获取popen的数据

示例脚本test.sh

点击(此处)折叠或打开

  1. #!/bin/sh
  2. echo 1, `date +%T`;
  3. sleep 1;
  4. echo 2, `date +%T`;
  5. sleep 10;
  6. echo 3, `date +%T`;
示例脚本test.php

点击(此处)折叠或打开

  1. #!/usr/bin/php
  2. <?php
  3.     # get argument for pipe here if it has.

  4.     # start pipe
  5.     echo 'call popen start: '.date("H:i:s")."\n";
  6.     $pipe = popen('/bin/sh '.dirname(__FILE__).'/test.sh','r');
  7.     echo 'call popen end: '.date("H:i:s")."\n";

  8.     # other code here
  9.     sleep(5);
  10.     echo "Here is my code. time: ".date("H:i:s"),"\n";

  11.     # read pipe result
  12.     while($s = fgets($pipe,1024)){
  13.         echo $s;
  14.     }

  15.     pclose($pipe);
  16. ?>
将文件test.sh和test.php放置在同一工作目录下,运行test.php,结果如下:

点击(此处)折叠或打开

  1. $ php test.php
  2. call popen start: 16:20:41
  3. call popen end: 16:20:41
  4. Here is my code. time: 16:20:46
  5. 1, 16:20:41
  6. 2, 16:20:42
  7. 3, 16:20:52

结束语:
代码方面, 我们有三个sleep。
php中一个 sleep 5,
sh中两个sleep, 10+1
如果使用串行的方式, 那么用时应该是10+1+5 = 16秒。
而使用pipe方式, 用时仅为:max(php, pipe) = max(5,11) = 11秒。
阅读(1527) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~