【问题标题】:Fatal error: Uncaught Error: Class 'Stomp' not found致命错误:未捕获的错误:未找到“Stomp”类
【发布时间】:2017-08-16 21:03:24
【问题描述】:

我已经下载了库:https://github.com/dejanb/stomp-php

然后实现如下代码:

<?php

   use FuseSource\Stomp\Stomp;
   (...)
$data=array($data1,$data2, $data3, $data4);
$json = json_encode($data, true);


$user = getenv("ACTIVEMQ_USER"); 
if( !$user ) $user = "admin";

$password = getenv("ACTIVEMQ_PASSWORD");
if( !$password ) $password = "password";

$destination  = '/topic/event';
$messages = 10000;
$size = 256;

$DATA = "calls";
$body = $data;
for($i=0; $i< $size; $i++) {
  $body .= $DATA[ $i % 26];
}

try {
  $url = 'tcp://localhost:61613';
  $con = new Stomp($url, $user, $password);

  for($i=0; $i< $messages; $i++) {
    $con->send($destination, $body);
    if( $i%1000 == 0 ) {
      echo "Sent ".$i." messages\n";
    }
  }

  $stomp->send($destination, "SHUTDOWN");

} catch(StompException $e) {
  echo $e->getMessage();
}
}

我得到这个错误:

致命错误:未捕获的错误:在 /opt/lampp/htdocs/skeleton-application/test.php:80 中找不到类“Stomp”

更新: 我按照https://github.com/stomp-php/stomp-php 的建议使用composer 重新安装。

我需要使用自动加载器

<?php
require __DIR__ . '/../vendor/autoload.php';

并添加了以下导入

use Stomp\Client;
use Stomp\StatefulStomp;
use Stomp\Network\Connection;
use Stomp\Transport\Message;

还是同样的错误...我需要对我的 activemq 代理做一些特别的事情吗?我通过控制台运行它......但仍然没有

【问题讨论】:

标签: php zend-framework stomp


【解决方案1】:

除了混淆使用哪个包之外,我们的代码还有以下问题:

  • 您还没有导入您正在使用的类,因此 PHP 无法在根命名空间中找到这些类
  • 您将参数传递给未使用的构造函数和其他方法,或者类型错误
  • 您显然有未定义的变量(例如,$stomp 未定义,或者代码示例中缺少它)

我建议一一解决这些问题。

使用fusesource/stomp-php

导入你正在使用的类

调整您的导入列表(这些是use 语句)以包含您在代码示例中引用的类:

use FuseSource\Stomp\Exception\StompException;
use FuseSource\Stomp\Stomp;

如果您的代码示例省略了包中的更多类,请将它们也包含在您的导入中。

去掉不必要的参数

当您创建FuseSource\Stomp\Stomp 的实例时,您正在传递构造函数不使用的参数。

改变

$con = new Stomp($url, $user, $password);

$con = new Stomp($url);

未定义的变量

您有一行代码引用了一个未定义的变量$stomp,而您可能打算在其中使用$con

改变

$stomp->send($destination, "SHUTDOWN");

$con->send($destination, new Message("SHUTDOWN"));

使用stomp-php/stomp-php

导入你正在使用的类

调整您的导入列表(这些是use 语句)以包含您在代码示例中引用的类:

use Stomp\Client;
use Stomp\Exception\StompException;
use Stomp\StatefulStomp;
use Stomp\Transport\Message;

如果您的代码示例省略了包中的更多类,请将它们也包含在您的导入中。

去掉不必要的参数

Stomp\Stomp\StatefulStomp 的构造函数与FuseSource\Stomp 的构造函数签名不同。

改变

$con = new Stomp($url, $user, $password);

$con = new StatefulStomp(new Client($url));

调整参数到需要的类型

send() 的签名已更改。

改变

$con->send($destination, $body);

$con->send($destination, new Message($body));        

未定义的变量

您有一行代码引用了一个未定义的变量$stomp,而您可能打算在其中使用$con

改变

$stomp->send($destination, "SHUTDOWN");

$con->send($destination, new Message("SHUTDOWN"));

参考见:

【讨论】:

  • 更新了我的答案以解决您的代码示例中的问题。
  • 由于 fusesource 已被弃用,我取消安装并使用此存储库:github.com/stomp-php/stomp-php 所以我不再拥有 Fusesource 库,而是 stomp...我通过 composer 安装它...
  • 调整了答案以包括对fusesource/stomp-phpstomp-php/stomp-php 的更正。
  • 未定义变量的部分是错误的,因为我将原来的“stomp”替换为“con”并忘记了一行...谢谢。
  • 这对你有用吗?如果是这样,请接受我的回答(看看stackoverflow.com/help/someone-answers)。
猜你喜欢
  • 2018-09-06
  • 2021-07-10
  • 2018-01-01
  • 1970-01-01
  • 2023-03-25
  • 2020-09-03
  • 1970-01-01
  • 2018-05-11
  • 2020-11-09
相关资源
最近更新 更多