<?php
/**
* Created by PhpStorm.
* User: james
* Date: 8/30/16
* Time: 12:28 PM
*/
include_once './vendor/autoload.php';
use Workerman\Worker;
use Workerman\Lib\Timer;
$active_socket = [];
$coap_wk = new Worker('Coap://0.0.0.0:50008');
//print_r($coap_wk);
$http_wk = new Worker('http://0.0.0.0:8080');
$http_wk->count = 4;
//
$http_wk->onWorkerStart = function ($worker) use(&$active_socket)
{
//global $active_socket;
//echo "Worker's id ={$worker->id}\n";
//$active_socket = $active_socket;
echo count($active_socket);
if ($worker->id === 3)
{
//$socket = $active_socket;
Timer::add(5, function() use (&$active_socket) {
var_dump(count($active_socket)); //
//echo " 4 eggs, 4 process.\n";
//print_r(count($active_socket));
});
}
};
$http_wk->onMessage = function ($connect, $data) use(&$active_socket)
{
//global $active_socket;
$active_socket[] = $connect;
//var_dump($data);
echo "onmessage";
var_dump($active_socket);
Timer::add(5, function() use (&$active_socket) {
var_dump(count($active_socket));
//echo " 4 eggs, 4 process.\n";
//print_r(count($active_socket));
});
$connect->send(rand(999, 99999999));
};
Worker::runAll();**我的问题是:**
我创建了两个回调闭包函数,并通过引用传递相同的变量。
当我收到请求时,我会在第二个回调函数上修改变量$active_socket,并将$active数组的编号改为var_dump。
根据PHP手册,如果通过引用传递变量。这意味着相同的内存地址,但是在onWorkerStart的回调函数中,我不能让onMessage更改$active_socket的值。
有人能告诉我发生了什么吗?或者我误解了PHP使用回调函数和通过引用传递变量的用法。
由衷地感谢您。
发布于 2017-07-14 13:33:24
关键是$http_wk->count = 4;,这意味着有4个进程。进程之间的变量是分开的。如果使用$http_wk->count = 1;,它将工作得很好。
https://stackoverflow.com/questions/39256567
复制相似问题