手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2012年12月的文章

转:PHP中利用pcntl实现多进程(模拟多线程)实例

 pcntl在很久很久之前就听过了,但是一直没有尝试着真正要用它。这不,遇到socket问题了,看socket,遇到pcntl了,再看看吧。

这里是某个人的测试代码:
PHP代码
  1. <?php  
  2. /** 
  3.  * 创建子进程入口 
  4.  * @author selfimpr 
  5.  * @blog http://blog.csdn.net/lgg201 
  6.  * @mail lgg860911@yahoo.com.cn 
  7.  * @param $func_name 代表子进程处理过程的函数名 
  8.  * @param other 接受不定参数, 提供给子进程的过程函数. 
  9.  */  
  10. function new_child($func_name)  
  11. {  
  12.     $args = func_get_args();  
  13.     unset($args[0]);  
  14.     $pid = pcntl_fork();  
  15.     if ($pid == 0) {  
  16.         function_exists($func_nameand exit(call_user_func_array($func_name$args)) or exit(-1);  
  17.     }  
  18.     else if ($pid == -1) {  
  19.         echo "Couldn’t create child process .";  
  20.     }  
  21. }  
  22. //测试处理函数, 输出$prefix连接的数组    
  23. function test($prefix$num)  
  24. {  
  25.     while ($i++ < $num) {  
  26.         echo $prefix . $i ."\n";  
  27.     }  
  28. }  
  29. //创建一个子进程    
  30. new_child("test""child process ", 100);  
  31. //父进程也开启一个与子进程同样多的循环.    
  32. test("parent process", 100);  
  33. //运行结果, 我这里运行父进程输出50个左右, 子进程开始运行.    
  34. ?>    
因为上面有作者有注释,所以我就不再多贴这篇文章的地址了。原网页的代码是错误的。我改了一下。原作者说的是:父进程输出50个左右时,子进程就开始运行了。我这边不是。我把数据改成1000后,发现父进程在950多的时候,子进程开始运行了。
原作者的博客上还有一个详细介绍:PHP扩展pcntl(进程控制以及信号处理)中文文档 
 
当然,看手册也可以,对了,风雪之隅也写过类似的文章,http://www.laruence.com/2009/06/11/930.html,他提到的优点就是:
XML/HTML代码
  1. 优点:  
  2.     1. 使用多进程, 子进程结束以后, 内核会负责回收资源  
  3.     2. 使用多进程,子进程异常退出不会导致整个进程Thread退出. 父进程还有机会重建流程.  
  4.     3. 一个常驻主进程, 只负责任务分发, 逻辑更清楚.  
然后他的代码就与上面有点区别,不过说白了还是大同小异:
PHP代码
  1. #!/bin/env php  
  2. <?php  
  3. /** A example denoted muti-process application in php 
  4. * @filename fork.php 
  5. * @touch date Wed 10 Jun 2009 10:25:51 PM CST 
  6. * @author Laruence<laruence@baidu.com> 
  7. * @license http://www.zend.com/license/3_0.txt PHP License 3.0 
  8. * @version 1.0.0 
  9. */  
  10.    
  11. /** 确保这个函数只能运行在SHELL中 */  
  12. if (substr(php_sapi_name(), 0, 3) !== 'cli') {  
  13.     die("This Programe can only be run in CLI mode");  
  14. }  
  15.    
  16. /** 关闭最大执行时间限制, 在CLI模式下, 这个语句其实不必要 */  
  17. set_time_limit(0);  
  18.    
  19. $pid = posix_getpid(); //取得主进程ID  
  20. $user = posix_getlogin(); //取得用户名  
  21.    
  22. echo <<<EOD  
  23. USAGE: [command | expression]  
  24. input php code to execute by fork a new process  
  25. input quit to exit  
  26.    
  27.         Shell Executor version 1.0.0 by laruence  
  28. EOD;  
  29.    
  30. while (true) {  
  31.    
  32.         $prompt = "\n{$user}$ ";  
  33.         $input = readline($prompt);  
  34.    
  35.         readline_add_history($input);  
  36.         if ($input == 'quit') {  
  37.                break;  
  38.           }  
  39.         process_execute($input . ';');  
  40. }  
  41.    
  42. exit(0);  
  43.    
  44. function process_execute($input) {  
  45.         $pid = pcntl_fork(); //创建子进程  
  46.         if ($pid == 0) {//子进程  
  47.                 $pid = posix_getpid();  
  48.                 echo "* Process {$pid} was created, and Executed:\n\n";  
  49.                 eval($input); //解析命令  
  50.                 exit;  
  51.         } else {//主进程  
  52.                 $pid = pcntl_wait($status, WUNTRACED); //取得子进程结束状态  
  53.                 if (pcntl_wifexited($status)) {  
  54.                         echo "\n\n* Sub process: {$pid} exited with {$status}";  
  55.                 }  
  56.         }  
  57. }  
做个笔记。
 
 
 
 

Tags: 多进程, pcntl

socket and soap

 其实本来不想定这个标题的。只是做了几个小小的测试

我用php实现了socket server,然后在命令行下做了点测试。在命令行下访问soap,并将返回值 给了客户端。

测试了一下。网速比较卡的情况下,基本在0.8秒左右 

然后我直接访问soap,打印出来的时候都差不多比命令行返回结果多了0.2秒。

这只是测试了soap请求一次。后来,我请求了两次。发现速度又快了0.1秒。

总计快了0.3秒。在命令行下用socket server返回数据好象快了一点。

-----------

文章只是我的一次记录,没有什么特别的意义。虽然不太科学,但对我来说,有三四台服务器的情况下,利用这个来交换数据还是有点用的。目前我的socket server只能用PHP实现,因为 部分代码都是靠PHP来获取数据的。本来想用go或者python来实现的,但目前没有时间。先用PHP了

 

 

备份:PhpStorm字体修改终极方案

 很久没有改过phpstorm的配色和字体方案了。小伟说,如果字体是12,那就是正常的。如果放到14就不太正常了。。。

然后找到了这个win下的配色方案,先备份一下,万一哪天就用win了呢。
原文来自:[查看](如果打不开,请直接搜索phpstorm即可),
 

其实phpstorm的字体修改跟netbeans是一模一样,  不同之处在于netbeans使用的是系统jre, 而phpstorm使用的自身的jre — window系统下是这样.

修改步骤如下.

1. 进入phpstorm安装目录下的jre, 如 PhpStorm 4.0.3\jre\jre\lib

2. 将该目录下的fontconfig.properties.src复制一份文件fontconfig.properties,并放在该目录下

3. 编辑文件fontconfig.properties,查找到下面一行:

sequence.monospaced.GBK=chinese-ms936, alphabetic,dingbats,symbol

修改成:

sequence.monospaced.GBK=alphabetic,chinese-ms936,dingbats,symbol

保存该文件后启动phpstorm, 在settings里的Editor – Colors & Fonts – Fonts里选择Monospaced字体, 大小16左右.

保存后就能看到一个完美的中英文编辑界面了.

--------

不过我用的字体和他不一样。不过也能做参考 .。

Tags: phpstorm

dash的一个小配置文件

 软件名叫DASH,这个plist文件是老鬼发我的,还不错。

 
com.kapeli.dash.plist
 
看手册是方便了。

Tags: dash

转:像打麻将一样干工作

这是一篇来自问库的文章,虽然说的很无耻,但也很有道理 :http://wenku.baidu.com/view/22732d8183d049649b665862.html

说白了,就是利益的关系,真的。。你看文章就是这么写的,看到最后你就会发现,确实是因为利益导致了工作的进度

原文如下:

国人都爱打麻将,我认为,只要拿出一半打麻将的精神,企业各部门之间的配合就会无缝对接。
 
仔细想一想,其实打麻将包含了所有企业成功的精髓。任何工作都不是一个人单打独斗,要的是集体配合。比如,你坐在我对面,你洗牌的时候,牌掉在我的脚下,谁捡?当然是我捡。因为早捡起来,早开局,我好早点赢钱。所以打麻将,不管谁掉了牌,都会有人尽快捡起来。
 
但在工作中呢?你做错了,凭什么我来帮你?你弄掉了,肯定由你捡,跟我有什么关系?一个人做错了,实际上跟大家都有关系,那么,为什么不能用打麻将的精神来工作?
 
打麻将的人从来不迟到,说好晚上8点,可还没到点,有三个人先到了,剩下的那个人在路上,这三个人电话一顿催:“快点来,三缺一”。那个人敢说:“急什么,不是8点吗”?结果,赶紧打个车跑来了,进门一看表才7点半。可他第一句话,肯定是:“不好意思,迟到了,让你们久等了”
 
为什么说迟到了?因为别人都比他早到。
 
另外,说好晚上12点收局,时间没到,一定有人举手要求“加班”。说:“实在不好意思,今晚输多了,再打一圈吧”?打一圈就打一圈,你赢了别人输了,不打不好意思。所以,打麻将通宵达旦是常事,但第二天很少有人抱怨自己又加了一个夜班。
 
打麻将的人从不抱怨工作环境。可是,我们现在对生活和工作的环境有多挑剔,什么宿舍太吵,洗碗时油太多,上班太累。。。。。你有没有见过打麻将的人说,房子吊顶太矮,空调不够冷,桌子太脏的?
 
打麻将冬天捂着被子打,夏天光着膀子打;没桌子把纸箱子倒放,放上板子就是麻将桌,洗脸盆垫上报纸就是凳子,麻将打得照样热火朝天。这时候要来个人说请吃饭,四个人肯定说改天去。可是我们工作上能做到吗?做不到,但是打麻将我们做到了。
 
还有一个神奇的地方,打麻将用手能摸出是什么牌。九万和六万,六条和九条,多小的差别,居然能摸出来。为什么?因为打麻将的人用心,用心的人学东西都能学进去,大不了慢一点,迟早会学会。
 
可是我们对工作呢,一遍一遍的出错。想想看,如果用一半的心感受工作会怎么样?还有学不会的吗?
 
最佩服的就是打麻将的人永远不抱怨被别人,只从自己身上找原因。输了钱的只会说:“自己手背”。上趟洗手间拼命洗手,回来后,在点儿好的人身上摸一把,再用别人的打火机点上一根烟,狠狠地抽一口,但是,永远不会抱怨别人。
Records:27123456