Skip to content

Commit 29b049a

Browse files
committed
Update fork child process in worker.
1 parent 846b825 commit 29b049a

File tree

3 files changed

+95
-63
lines changed

3 files changed

+95
-63
lines changed

examples/server.php

Lines changed: 45 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//'open_eof_check' => true,
77
//'package_eof' => "\r\n",
88
//'ipc_mode' => 2,
9-
'task_worker_num' => 1,
9+
//'task_worker_num' => 1,
1010
//'task_ipc_mode' => 1,
1111
//'dispatch_mode' => 1,
1212
//'daemonize' => 1,
@@ -28,6 +28,48 @@ function my_log($msg)
2828
echo "#".$serv->worker_pid."\t".$msg.PHP_EOL;
2929
}
3030

31+
function forkChildInWorker() {
32+
global $serv;
33+
echo "on worker start\n";
34+
$serv->addtimer(2000);
35+
$process = new swoole_process ( function (swoole_process $worker) {
36+
swoole_event_add ($worker->pipe, function ($pipe) use ($worker) {
37+
echo $worker->read()."\n";
38+
});
39+
40+
swoole_timer_add (1000, function ($interval) use ($worker) {
41+
echo "#{$worker->pid} child process timer $interval\n"; // 如果worker中没有定时器,则会输出 process timer xxx
42+
});
43+
} );
44+
$pid = $process->start();
45+
echo "Fork child process success. pid={$pid}\n";
46+
//保存子进程对象,这里如果不保存,那对象会被销毁,管道也会被关闭
47+
$serv->childprocess = $process;
48+
}
49+
50+
function processRename($serv, $worker_id) {
51+
52+
global $argv;
53+
if($worker_id >= $serv->setting['worker_num'])
54+
{
55+
swoole_set_process_name("php {$argv[0]}: task");
56+
}
57+
else
58+
{
59+
swoole_set_process_name("php {$argv[0]}: worker");
60+
}
61+
echo "WorkerStart: MasterPid={$serv->master_pid}|Manager_pid={$serv->manager_pid}";
62+
echo "|WorkerId={$serv->worker_id}|WorkerPid={$serv->worker_pid}\n";
63+
64+
if ($worker_id == 1)
65+
{
66+
$serv->addtimer(2000);
67+
$serv->addtimer(6000);
68+
//echo microtime(true)."\n";
69+
//var_dump($serv->gettimer());
70+
}
71+
}
72+
3173
function my_onShutdown($serv)
3274
{
3375
echo "Server: onShutdown\n";
@@ -52,25 +94,8 @@ function my_onConnect($serv, $fd, $from_id)
5294

5395
function my_onWorkerStart($serv, $worker_id)
5496
{
55-
global $argv;
56-
if($worker_id >= $serv->setting['worker_num'])
57-
{
58-
swoole_set_process_name("php {$argv[0]}: task");
59-
}
60-
else
61-
{
62-
swoole_set_process_name("php {$argv[0]}: worker");
63-
}
64-
echo "WorkerStart: MasterPid={$serv->master_pid}|Manager_pid={$serv->manager_pid}";
65-
echo "|WorkerId={$serv->worker_id}|WorkerPid={$serv->worker_pid}\n";
66-
67-
if ($worker_id == 1)
68-
{
69-
$serv->addtimer(2000);
70-
$serv->addtimer(6000);
71-
//echo microtime(true)."\n";
72-
//var_dump($serv->gettimer());
73-
}
97+
//forkChildInWorker();
98+
processRename($serv, $worker_id);
7499
}
75100

76101
function my_onWorkerStop($serv, $worker_id)

swoole.c

Lines changed: 44 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1545,19 +1545,20 @@ PHP_FUNCTION(swoole_connection_info)
15451545
{
15461546
zval *zobject = getThis();
15471547
swServer *serv;
1548+
zend_bool noCheckConnection = 0;
15481549
long fd = 0;
15491550
long from_id = -1;
15501551

15511552
if (zobject == NULL)
15521553
{
1553-
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol|l", &zobject, swoole_server_class_entry_ptr, &fd, &from_id) == FAILURE)
1554+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol|lb", &zobject, swoole_server_class_entry_ptr, &fd, &from_id, &noCheckConnection) == FAILURE)
15541555
{
15551556
return;
15561557
}
15571558
}
15581559
else
15591560
{
1560-
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|l", &fd, &from_id) == FAILURE)
1561+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|lb", &fd, &from_id, &noCheckConnection) == FAILURE)
15611562
{
15621563
return;
15631564
}
@@ -1566,49 +1567,49 @@ PHP_FUNCTION(swoole_connection_info)
15661567

15671568
swConnection *conn = swServer_connection_get(serv, fd);
15681569

1569-
//It's udp
1570-
if (conn == NULL)
1571-
{
1572-
array_init(return_value);
1573-
php_swoole_udp_t udp_info;
1574-
if (from_id < 0)
1575-
{
1576-
from_id = php_swoole_udp_from_id;
1577-
}
1578-
memcpy(&udp_info, &from_id, sizeof(udp_info));
1570+
//udp client
1571+
if (conn == NULL)
1572+
{
1573+
array_init(return_value);
1574+
php_swoole_udp_t udp_info;
1575+
if (from_id < 0)
1576+
{
1577+
from_id = php_swoole_udp_from_id;
1578+
}
1579+
memcpy(&udp_info, &from_id, sizeof(udp_info));
15791580

1580-
swConnection *from_sock = swServer_connection_get(serv, udp_info.from_fd);
1581-
struct in_addr sin_addr;
1582-
sin_addr.s_addr = fd;
1583-
if (from_sock != NULL)
1584-
{
1585-
add_assoc_long(return_value, "from_fd", udp_info.from_fd);
1586-
add_assoc_long(return_value, "from_port", from_sock->addr.sin_port);
1587-
}
1588-
if (from_id !=0 )
1589-
{
1590-
add_assoc_long(return_value, "remote_port", udp_info.port);
1591-
}
1592-
add_assoc_string(return_value, "remote_ip", inet_ntoa(sin_addr), 1);
1593-
return;
1594-
}
1581+
swConnection *from_sock = swServer_connection_get(serv, udp_info.from_fd);
1582+
struct in_addr sin_addr;
1583+
sin_addr.s_addr = fd;
1584+
if (from_sock != NULL)
1585+
{
1586+
add_assoc_long(return_value, "from_fd", udp_info.from_fd);
1587+
add_assoc_long(return_value, "from_port", from_sock->addr.sin_port);
1588+
}
1589+
if (from_id != 0)
1590+
{
1591+
add_assoc_long(return_value, "remote_port", udp_info.port);
1592+
}
1593+
add_assoc_string(return_value, "remote_ip", inet_ntoa(sin_addr), 1);
1594+
return;
1595+
}
15951596

1596-
//connection is closed
1597-
if (conn->active == 0)
1598-
{
1599-
RETURN_FALSE;
1600-
}
1601-
else
1602-
{
1603-
array_init(return_value);
1604-
add_assoc_long(return_value, "from_id", conn->from_id);
1605-
add_assoc_long(return_value, "from_fd", conn->from_fd);
1606-
add_assoc_long(return_value, "connect_time", conn->connect_time);
1607-
add_assoc_long(return_value, "last_time", conn->last_time);
1608-
add_assoc_long(return_value, "from_port", serv->connection_list[conn->from_fd].addr.sin_port);
1609-
add_assoc_long(return_value, "remote_port", ntohs(conn->addr.sin_port));
1610-
add_assoc_string(return_value, "remote_ip", inet_ntoa(conn->addr.sin_addr), 1);
1611-
}
1597+
//connection is closed
1598+
if (conn->active == 0 && !noCheckConnection)
1599+
{
1600+
RETURN_FALSE;
1601+
}
1602+
else
1603+
{
1604+
array_init(return_value);
1605+
add_assoc_long(return_value, "from_id", conn->from_id);
1606+
add_assoc_long(return_value, "from_fd", conn->from_fd);
1607+
add_assoc_long(return_value, "connect_time", conn->connect_time);
1608+
add_assoc_long(return_value, "last_time", conn->last_time);
1609+
add_assoc_long(return_value, "from_port", serv->connection_list[conn->from_fd].addr.sin_port);
1610+
add_assoc_long(return_value, "remote_port", ntohs(conn->addr.sin_port));
1611+
add_assoc_string(return_value, "remote_ip", inet_ntoa(conn->addr.sin_addr), 1);
1612+
}
16121613
}
16131614

16141615
PHP_FUNCTION(swoole_connection_list)

swoole_process.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,12 @@ PHP_METHOD(swoole_process, start)
238238
php_sw_reactor_ok = 0;
239239
}
240240

241+
if (SwooleG.timer.fd)
242+
{
243+
swTimer_free(&SwooleG.timer);
244+
bzero(&SwooleG.timer, sizeof(SwooleG.timer));
245+
}
246+
241247
zend_update_property_long(swoole_server_class_entry_ptr, getThis(), ZEND_STRL("pid"), process->pid TSRMLS_CC);
242248
zend_update_property_long(swoole_process_class_entry_ptr, getThis(), ZEND_STRL("pipe"), process->pipe TSRMLS_CC);
243249

0 commit comments

Comments
 (0)