Swoole报错Uncaught Error: Call to undefined function Swoole\Coroutine\run()

Swoole报错。
Uncaught Error: Call to undefined function Swoole\Coroutine\run() 怎么处理?

use function Swoole\Coroutine\run;
use function Swoole\Coroutine\go;

run(function() {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://httpbin.org/get');
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($ch);
    curl_close($ch);
    var_dump($result);
});

这个错误信息提示的是 Swoole 扩展中的 Coroutine 类中的 run 方法未定义,可能是你的 Swoole 扩展版本过低,缺少该方法。

可以通过更新或重装 Swoole 扩展来解决该问题。建议使用最新版本的 Swoole 扩展。

在 Linux 系统中,可以使用以下命令更新 Swoole:

pecl install swoole


在 Windows 系统中,可以从 PHP 官网下载对应版本的 Swoole DLL 文件,然后修改 php.ini 文件,在其中添加以下配置:


extension=swoole.so

或者在 PHP 7.4 之后的版本可以直接使用以下命令安装:


php -d extension=swoole.so your_script.php

安装完毕后,重启 PHP-FPM 或者 Web 服务器,再次运行你的代码即可。

未捕获错误:调用未定义的函数Swoole\Coroutine\run()

根据报错中文释义,大致分析是因为在使用 Swoole 模块时出现了一个未定义的函数调用。
可能原因和思路建议:
1、未正确加载Swoole 模块
思路:正确安装和正确配置Swoole 模块环境
2、模块路径错误
思路:检查导入方式和路径下文件是否存在
3、模块版本不匹配
思路:将Swoole 模块的升级到最新版本【可以去官网下载匹配的版本】

检查下你的Swoole 版本是否过低了,可以使用php --ri swoole 命令查看当前安装的Swoole版本。尝试升级下版本看看。
尝试修改 PHP.ini配置文件名,开启短名:

img

问题解决

可以借鉴下

use Swoole\Runtime;
use Swoole\Coroutine;
use function Swoole\Coroutine\run;
error_reporting(E_ALL);
ini_set('display_errors', 'on');

$s = microtime(true);
// Swoole\Coroutine\run()见'协程容器'章节
run(function () {
    for ($c = 500; $c--;) {
        Coroutine::create(function () {
            $pdo = new PDO('mysql:host=127.0.0.1;dbname=test;charset=utf8',
                'test', 'test');
            $statement = $pdo->prepare('SELECT MAX(id) FROM `users`');
            for ($n = 1; $n--;) {
                $statement->execute();
                var_dump($statement->fetchAll());
            }
        });
    }
});
echo 'use '.(microtime(true) - $s).' s';

以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:
从错误信息可以看出,Swoole\Coroutine\run()函数不存在,这是因为您的PHP环境没有启用Swoole coroutine支持。
要解决这个错误,需要:

  1. 安装Swoole拓展。如果尚未安装Swoole,需要先安装它。可以使用pecl安装:
pecl install swoole

或者从源码编译安装。
2. 启用PHP的Swoole coroutine支持。这需要在php.ini中配置:

extension=swoole.so
swoole.enable_coroutine=1

  1. 重启PHP环境使配置生效。
  2. 确认Swoole版本>=4.2.8。Swoole coroutine需要4.2.8及以上版本,如果Swoole版本过低需要升级。
  3. 代码中use function Swoole\Coroutine;的命名空间需改为:
php
use Swoole\Coroutine as co; 
co\run()和co\go()函数需要从Swoole\Coroutine命名空间引入。

配置完成后,PHP代码可以正常使用Swoole coroutine,您的代码可以改写为:

php
use Swoole\Coroutine as co; 

co\run(function() {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://httpbin.org/get');
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($ch);
    curl_close($ch);
    var_dump($result);
});

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这个错误可能是由于您使用的Swoole版本不支持Coroutine\run()函数导致的,因为在Swoole 2.x版本及以上,Coroutine\run()已被弃用。

相反,您可以使用以下方法来运行Swoole协程:

\Swoole\Runtime::enableCoroutine();

例如,您可以将上面的代码修改为:

```php
use Swoole\Coroutine;

Coroutine::create(function () {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://httpbin.org/get');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOP