• ~~~~(>_<)~~~~

    原文:swoole_process提供了基于unixsock的进程间通信,使用很简单只需调用recv/send即可 没有发现recv和send方法 ,这个是server才有的,貌似只有队列和管道

  • signDBG

    请教一下: Process 有提供, 但是没有Threads,是不是没有提供PHP函数

  • 桄欣

    为什么操作队列的方法是push/pop,这不是描述栈操作的名称么……

  • 这个问题么

    请问怎么调用和使用,文档看的不是十分明白。有相关的demo么,还须要配置服务器么,

  • test

    1.7的时候,还可在创建的进程里调用task,1.8就不行了,报错 Warning: swoole_server::task(): The method can only be used in the worker process.

  • 不吃饭

    根本不支持fpm好吧:swoole_process must run at php_cli environment.

  • lockfan

    1.7.x是可以的,1.8为什么取消了还不知道,文档里也没说

  • Jetbrains

    请问为什swoole_timer_tick在process里边时间设置不准确呢

  • 俩鱼

    你好,我使用1.8.*是支持在fpm下运行的。

  • 俩鱼

    相信swoole扩展是很强大的。用纯C写的,运行效率一定会高。但文档写得不太严谨。并且文档中有多的感情色彩,不够理性!比如会出现一些字眼:完美、无缝、强悍、易用、轻松、方便。最好也别在技术文档中批评别人家东西。要矜持…[挖鼻屎]

  • 俩鱼

    创建一个子进程,通过exec方法去调用一个python脚本。如果python脚本中有raw_input()方法时,主进程无法通过管理获取数据。在centos的cli, fpm模式下都不可以。用proc_open调用此python脚本就可以通过pipe获取到数据。不知是哪里使用不当!

  • 俩鱼

    不好意思,打错字了。是“主进程无法通过管道获取数据”。

  • 刘高云

    这个实例中子进程内将最大子进程数设置多1个时, $this->new_index++语句未生效,一直未初始值0,求大神解释?

  • 刘高云

    这个是多进程程序吧,父进程和子进程有自己的数据空间和代码空间,即便使用匿名函数传递参数,子进程也只是获得父进程的副本,子进程的数据空间的修改对父进程的数据空间并不会造成改变。应该使用swoole_table共享空间来做这个实例吧

  • 刘高云

    官方给的示例,父子进程的数据交换不正确,父子进程各有各的数据空间,改变某个进程中成员变量的值并不能影响其他进程的数据空间,不可以。下面是我使用共享内容修改后的示例 <?php class MainProcess{ public $mpid = 0; public $works = []; public $max_process = 5; public static $swoole_table = NULL;

    public function __construct(){
        try{
            self::$swoole_table = new swoole_table(1024);
            self::$swoole_table->column('index', swoole_table::TYPE_INT);//用于父子进程间数据交换
            self::$swoole_table->create();
            swoole_set_process_name('php-ps:master');
            $this->mpid = posix_getpid();
            $this->run();
            $this->processWait();
        }catch(\Exception $e){
            die('ALL ERROR:'.$e->getMessage());
        }
    }
    
    public function run(){
        for($i=0;$i < $this->max_process; $i++){
            $this->createProcess();
        }
    }
    public function createProcess($index=null){
        $process = new swoole_process(function(swoole_process $worker) use ($index) {
            if(is_null($index)){//如果没有指定了索引,新建的子进程,开启计数
                $index=self::$swoole_table->get('index');
                if($index === false){
                    $index = 0;
                }else{
                    $index++;
                }
            }
    
            self::$swoole_table->set('index',array('index'=>$index));
            swoole_set_process_name("php-ps:{$index}");
            for($j=0;$j<16000;$j++){
                $this->checkMpid($worker);
                echo "msg:{$j}\n";
                sleep(1);
            }
        },false, false);
        $pid = $process->start();
        $index=self::$swoole_table->get('index');
        $index=$index['index'];
        $this->works[$index] = $pid;
        return $pid;
    }
    
    public function checkMpid(&$worker){
        if(!swoole_process::kill($this->mpid,0)){ //import! check whether master process is running  
            $worker->exit();
            file_put_contents('/tmp/runtime.log', "Master process exited, I [{$worker['pid']}] also quit\n", FILE_APPEND);
        }
    }
    
    public function rebootProcess($res){
    
        $pid = $ret['pid'];
        $index = array_search($pid, $this->works);
        if($index!==false){
            $index = intval($index);
            $new_pid = $this->createProcess($index);
            echo "rebootProcess:{$index}={$new_pid} Done\n";
            return;
        }
    
        throw new \Exception("rebootProcess Error: no pid");
    }
    
    public function processWait(){
        while(1){
            if(count($this->works)){//$result = array('code' => 0, 'pid' => 15001, 'signal' => 15);
                $ret = swoole_process::wait();
            }else{
                $this->rebootProcess($ret);
            }
        }
    }
    

    }

    new MainProcess();

  • 何曦

    process打错了,打成了precess

  • Ma.Alex

    这个文章 很好哦