centos
workerman 3.0 版
照著手冊(cè)的定時(shí)任務(wù)例子做了,沒(méi)有任何輸出。
use \Workerman\Worker;
$task = new Worker();
// 開(kāi)啟多少個(gè)進(jìn)程運(yùn)行定時(shí)任務(wù),注意多進(jìn)程并發(fā)問(wèn)題
$task->count = 1;
$task->onWorkerStart = function($task)
{
$time_interval = 2;
\Workerman\Lib\Timer::add($time_interval, function()
{
echo "task run\n";
});
};
這樣做倒是有輸出。
\Workerman\Lib\Timer::add(1,function(){echo "task run\n";});
所以我想,是不是進(jìn)程的問(wèn)題
$task = new Worker();
那么這個(gè)是需要擴(kuò)展支持還是?
代碼按照手冊(cè)規(guī)范要放在Applications/項(xiàng)目/start.php中,不知道killhook放在哪里運(yùn)行的。
例如新建文件Applications/Test/start.php
use \Workerman\Worker;
$task = new Worker();
// 開(kāi)啟多少個(gè)進(jìn)程運(yùn)行定時(shí)任務(wù),注意多進(jìn)程并發(fā)問(wèn)題
$task->count = 1;
$task->onWorkerStart = function($task)
{
$time_interval = 2;
\Workerman\Lib\Timer::add($time_interval, function()
{
echo "task run\n";
});
};
這樣表示要建立了一個(gè)Worker進(jìn)程,Worker進(jìn)程在啟動(dòng)的時(shí)候建立了一個(gè)定時(shí)任務(wù),2秒運(yùn)行一次,輸出 “task run\n”
在workerman根目錄運(yùn)行 php start.php start 運(yùn)行查看結(jié)果
首先很感謝你的耐心回答
問(wèn)題確實(shí)如你所說(shuō),若要建立一個(gè)進(jìn)程的話,這份代碼必須放在項(xiàng)目的start.php文件中。
我的是放在自己建立的文件里了,所以不能新建進(jìn)程,只能添加一個(gè)定時(shí)任務(wù)于當(dāng)前進(jìn)程。
另外還有一個(gè)問(wèn)題想請(qǐng)教,我希望在start.php文件里添加一個(gè)定時(shí)任務(wù),定時(shí)執(zhí)行我自己建立的一個(gè)文件里的類(lèi)里的函數(shù)。
但引入路徑無(wú)論怎么寫(xiě),都說(shuō)致命錯(cuò)誤,找不到類(lèi)。
該文件路徑為 Applications/項(xiàng)目/MyFunction/TictakEvent.php
TictakEvent.php的代碼為
namespace MyFunction;
use \GatewayWorker\Lib\Gateway;
use \GatewayWorker\Lib\Store;
class TictakEvent
{
public static function renwu_send($name){
echo $name;
}
}
按以下方式并不能引入。
use MyFunction\TictakEvent;
$task = new Worker();
$task->count = 1;
$task->onWorkerStart = function($task)
{
$time_interval = 3;
\Workerman\Lib\Timer::add($time_interval, function()
{
\MyFunction\TictakEvent::renwu_send(‘test’);
});
};
use \Workerman\Worker; 這個(gè)已經(jīng)引入了,我怕我描述的不夠詳細(xì)。
詳細(xì)錯(cuò)誤是說(shuō)找不到這個(gè)類(lèi) \MyFunction\TictakEvent
你好,之后又產(chǎn)生了新的問(wèn)題。
已經(jīng)可以在項(xiàng)目start文件里添加新進(jìn)程定時(shí)運(yùn)行我自己建立的文件了
在我自己的文件函數(shù)里,有用到
Gateway::sendToAll('{"message":"hehe","type":"test"}',$user_list);
但使用時(shí)報(bào)錯(cuò)
PHP Warning: Invalid argument supplied for foreach() in /home/www/workerman/GatewayWorker/Lib/Gateway.php on line 54
$user_list 我var_dump出來(lái)是有值的。
array(2) {
=>
int(4)
=>
int(3)
}
但不知為何,傳入sendToAll后,我在Gateway文件里加入了var_dump的語(yǔ)句來(lái)檢查我傳入的數(shù)組,結(jié)果卻是
bool(false)
我這測(cè)試沒(méi)有問(wèn)題,這里是start.php的全部代碼
<?php
use \Workerman\WebServer;
use \GatewayWorker\Gateway;
use \GatewayWorker\BusinessWorker;
use \Workerman\Lib\Timer;
use \Workerman\Worker;
// gateway
$gateway = new Gateway("Websocket://0.0.0.0:8585");
$gateway->name = 'TodpoleGateway';
$gateway->count = 4;
$gateway->lanIp = '127.0.0.1';
$gateway->startPort = 4000;
$gateway->pingInterval = 10;
$gateway->pingData = '{"type":"ping"}';
// bussinessWorker
$worker = new BusinessWorker();
$worker->name = 'TodpoleBusinessWorker';
$worker->count = 4;
// ##############讓一個(gè)小蝌蚪定時(shí)說(shuō)hello 開(kāi)始#########
$task = new Worker();
$task->onWorkerStart = function($task){
Timer::add(5, function(){
$client_list = \GatewayWorker\Lib\Gateway::getOnlineStatus();
\GatewayWorker\Lib\Gateway::sendToAll(json_encode(array('type'=>'message', 'id'=>current($client_list), 'message' => 'hello')));
});
};
// ##############讓一個(gè)小蝌蚪定時(shí)說(shuō)hello 完畢#########
// WebServer
$web = new WebServer("http://0.0.0.0:8686");
$web->count = 2;
$web->addRoot('www.your_domain.com', __DIR__.'/Web');
你可以自己var_dump定位下是哪里的問(wèn)題,問(wèn)題應(yīng)該很好找
你的代碼我測(cè)試下來(lái)是沒(méi)有問(wèn)題的
我的代碼放到項(xiàng)目/Event.php里于當(dāng)前進(jìn)程執(zhí)行也是沒(méi)有問(wèn)題的
但是一旦放在我自己新建的文件里,問(wèn)題就出來(lái)了。
經(jīng)過(guò)跟蹤調(diào)試發(fā)現(xiàn),在\GatewayWorker\Lib\Gateway.php 文件的第42行起
如果是在項(xiàng)目的start.php文件里做的新建進(jìn)程或者是在項(xiàng)目的Event.php里做的添加至當(dāng)前進(jìn)程,
在執(zhí)行sendToAll時(shí),self::$businessWorker為真,執(zhí)行if里的語(yǔ)句
而如果是在項(xiàng)目start.php里新建進(jìn)程去定時(shí)調(diào)用我自己建立的文件里的函數(shù)。
這個(gè)函數(shù)在執(zhí)行sendToAll時(shí),self::$businessWorker為假,執(zhí)行的是else里的語(yǔ)句。
我想這就是問(wèn)題所在吧。。
// 如果有businessWorker實(shí)例,說(shuō)明運(yùn)行在workerman環(huán)境中,通過(guò)businessWorker中的長(zhǎng)連接發(fā)送數(shù)據(jù)
if(self::$businessWorker)
{
foreach(self::$businessWorker->gatewayConnections as $gateway_connection)
{
$gateway_connection->send($gateway_data);
}
}
// 運(yùn)行在其它環(huán)境中,使用udp向worker發(fā)送數(shù)據(jù)
else
{
$all_addresses = Store::instance('gateway')->get('GLOBAL_GATEWAY_ADDRESS');
foreach($all_addresses as $address)
{
self::sendToGateway($address, $gateway_data);
}
}
walkor,我鄭重的向你道歉,我始終還是咽不下定時(shí)進(jìn)程這口氣,盯著你的源碼看了良久,又在腦海里把Gateway/Worker 的進(jìn)程模型翻來(lái)覆去的想。終于明白。都是我的錯(cuò),為了便于調(diào)試,我在我自己的業(yè)務(wù)處理類(lèi)里的客戶(hù)登陸那加入了以下代碼。
$store = Store::instance('room');
$store->flush();
這樣,你的Gateway.php又哪里能取到值。。。。。
$all_addresses = Store::instance('gateway')->get('GLOBAL_GATEWAY_ADDRESS');
非常抱歉。以及感謝你的耐心和專(zhuān)業(yè)。