V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
UnrealEngine
V2EX  ›  PHP

萌新第一次接触 gearman 服务无法使用问题,请问要如何调试才好?

  •  
  •   UnrealEngine · 2020-06-18 22:06:17 +08:00 · 1557 次点击
    这是一个创建于 1598 天前的主题,其中的信息可能已经有所发展或是发生改变。

    线上有块功能是用 gearman 任务分发来完成的,但是之前负责这块的员工已经离职了,运维也不清楚这一块,所以第一次接手是一头雾水。

    核心代码如下(原代码比较冗长,我这里就缩写了):

    $worker = new GearmanClient();

    $worker->addServer('10.0.0.5', 4730);

    $worker->setCompleteCallback("complete");

    $worker->addTask('doSomething', 'yes', null, $id);

    $worker->runTasks();

    $result = $worker->getResult();

    这块功能之前正常,但是换了服务器后这块功能就失灵了。

    怎么调试确实不懂,运维也问我怎么测试比较好。

    8 条回复    2020-07-01 22:44:00 +08:00
    UnrealEngine
        1
    UnrealEngine  
    OP
       2020-06-18 22:28:14 +08:00
    执行 php --info | grep "gearman support"后显示正确安装
    couashi
        2
    couashi  
       2020-06-19 09:30:22 +08:00
    需要安装 gearmand, 安装 gearman 的 php 扩展, 启动 gearmand 服务
    UnrealEngine
        3
    UnrealEngine  
    OP
       2020-06-19 10:15:51 +08:00
    @couashi gearmand 和 php 的扩展都安装好了的
    GuangXiN
        4
    GuangXiN  
       2020-06-19 10:47:06 +08:00 via Android
    换了服务器之后 server ip 变了?
    UnrealEngine
        5
    UnrealEngine  
    OP
       2020-06-19 12:45:02 +08:00
    @couashi
    @GuangXiN 试着调试了下,addtask 没问题,返回了 true,但是 runtasks 的时候返回了 false,但是依然不知道怎么解决
    couashi
        6
    couashi  
       2020-06-19 18:46:27 +08:00
    @UnrealEngine

    client.php
    couashi
        7
    couashi  
       2020-06-19 18:47:36 +08:00
    1 <?php
    2 $worker = new GearmanClient();
    3
    4 $worker->addServer();
    5
    6 $worker->setCompleteCallback("complete");
    7
    8 $worker->setCreatedCallback('created');
    9
    10 $worker->addTask('doSomething', 'yes', null);
    11
    12 var_dump($worker->runTasks());
    13
    14 function created($task)
    15 {
    16 print "已创建任务:" . $task->jobHandle(). PHP_EOL;
    17 }
    18
    19 function complete($task)
    20 {
    21 print "完成:" . $task->data() . PHP_EOL;
    22 }


    server.php

    1 <?php
    2 $worker = new GearmanWorker();
    3
    4 $worker->addServer();
    5
    6 $worker->addFunction('doSomething', 'doSomethingFn');
    7
    8 print "等待处理...." . PHP_EOL;
    9
    10 while ($worker->work()) {
    11
    12 }
    13
    14 function doSomethingFn($job)
    15 {
    16 print "已收到,正在处理..". $job->handle() . PHP_EOL;
    17 $workload = $job->workload();
    18 $workload_size = $job->workloadSize();
    19
    20 print "Workload: $workload ($workload_size)" . PHP_EOL;
    21
    22 $result = "doSomething | " . $workload;
    23 print "处理完成,返回结果: " . $result;
    24 return $result;
    25 }
    UnrealEngine
        8
    UnrealEngine  
    OP
       2020-07-01 22:44:00 +08:00
    @couashi 我有两套代码,都是在同一套服务器不同文件夹下,但是他们 gearman 的 ip 是相同的,然后代码 1 doBackground 时添加的函数会等同于代码 2 里的函数吗?(代码 1 没有这个函数但是代码 2 有)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1225 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 18:17 · PVG 02:17 · LAX 11:17 · JFK 14:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.