GlobalData数据共享组件用例报错BUG

zhouaini528

问题描述

两个php文件 一个server.php 一个client.php

开启server共享进程,client报如下错误

PHP Fatal error: Uncaught RuntimeException: Timer can only be used in workerman running environment in /home/lwj/PhpstormProjects/wman/vendor/workerman/workerman/src/Timer.php:15

程序代码或配置

server.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
// 监听端口
$worker = new GlobalData\Server('127.0.0.1', 22017);
Worker::runAll();
?>

client.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
$global = new GlobalData\Client('127.0.0.1:22017');
if($global->add('some_key', 10))
{
    // $global->some_key赋值成功
    echo "add success " , $global->some_key;
}
else
{
    // $global->some_key已经存在,赋值失败
    echo "add fail " , var_export($global->some_key);
}

重现问题的步骤

server.php 运行正常
root@# php server.php start
Workerman[server.php] start in DEBUG mode
-------------------------------------------------- WORKERMAN ---------------------------------------------------
Workerman/5.1.3 PHP/8.1.2-1ubuntu2.22 (JIT off)Linux/6.8.0-85-generic
--------------------------------------------------- WORKERS ----------------------------------------------------
event-loop proto user worker listen count state
select tcp root globalDataServer frame://127.0.0.1:22017 1 [OK]

client.php 报错

PHP Fatal error: Uncaught RuntimeException: Timer can only be used in workerman running environment in

操作系统环境及workerman/webman等具体版本

ubuntu 24.04

php8.2

160 2 0
2个回答

小W

client也需要workerman环境

  • zhouaini528 6天前

    不是看文档说 php-fpm 下都支持吗? 如果加入了workerman 咋个支持?

  • 小W 6天前

    那就用php-fm的用法...

  • 小W 6天前

    复制粘贴文档示例代码

chen

Client.php 源码里有这个判断,你用fpm跑你代码就没问题了应该

if(class_exists('\Workerman\Timer') && php_sapi_name() === 'cli')
{
    $timer_id = \Workerman\Timer::add($this->pingInterval, function($connection)use(&$timer_id)
    {
        $buffer = pack('N', 8)."ping";
        if(strlen($buffer) !== @fwrite($connection, $buffer))
        {
            @fclose($connection);
            \Workerman\Timer::del($timer_id);
        }
    }, array($connection));
}
🔝