php swoft的PHPUnit的错误的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php swoft的PHPUnit的错误的相关的知识,希望对你有一定的参考价值。

解决swoft的phpunit的各种报错bug

# json_deconde报错
是fread获取时只获取1024个字节
通过ServicePool重写SyncServiceConnection类


# uri为空
通过uri_bug.php这里的提示做修改
<?php
/**
 * Created by PhpStorm.
 * User: code
 * Date: 2018/10/30
 * Time: 下午7:58
 */

namespace App\Pool;


use App\Helper\Vendor\PhpunitSyncServiceConnection;
use Swoft\App;
use Swoft\Pool\ConnectionInterface;
use Swoft\Rpc\Client\Service\ServiceConnection;

class ServicePool extends \Swoft\Rpc\Client\Pool\ServicePool
{
    public static $phpunitBool = false;

    public function createConnection(): ConnectionInterface
    {
        if (static::$phpunitBool){ // 兼容phpunit
            if (!App::isCoContext()){ // 进入
                return new PhpunitSyncServiceConnection($this);
            }else if (App::isCoContext()) { // 照旧
                return new ServiceConnection($this);
            }

        }

        return parent::createConnection();
    }

}
<?php
/**
 * Created by PhpStorm.
 * User: code
 * Date: 2018/10/30
 * Time: 下午8:04
 */

namespace App\Helper\Vendor;

use Swoft\Rpc\Client\Service\SyncServiceConnection;

/**
 * 解决phpunit的json_decode报错问题
 *
 * Class SyncServiceConnection
 * @package App\Helper\Vendor
 */
class PhpunitSyncServiceConnection extends SyncServiceConnection
{

    public function recv(): string
    {
        stream_set_timeout($this->connection,1);
        return stream_get_contents($this->connection);

        // todo 待完善
        stream_set_timeout($this->connection,1);
//        stream_set_blocking($this->connection, 0); // tcp会阻塞

        $contents = '';
        $done = false;
        while (is_resource($this->connection) && !$done && !feof($this->connection)) {
            $temp = fread($this->connection, 1024); // tcp会阻塞

            if ($temp === '' || $temp === false){
                fclose($this->connection); // 否则会假死,服务端不会主动关闭
                break;
            }

            $contents .= $temp;

            if (
                !is_resource($this->connection) ||
                strlen($temp) < 1024
//                (strlen($temp) < 1024 && preg_match("/[^\\\\]}/", $temp))
            ) {
                fclose($this->connection); // 否则会假死,服务端不会主动关闭
                break;
            }
        }

        return $contents;
    }

}
<?php

// 在\Swoft\Bean\BeanFactory::init();之后调用
// 参考vendor/swoft/websocket-server/test/bootstrap.php
// 解决uri为空的问题
/* @var \Swoft\Bootstrap\Boots\Bootable $bootstrap */
$bootstrap = \Swoft\App::getBean(\Swoft\Bootstrap\Bootstrap::class);
$bootstrap->bootstrap();
// 解决json_decode报错问题
\App\Pool\ServicePool::$phpunitBool = true;

以上是关于php swoft的PHPUnit的错误的的主要内容,如果未能解决你的问题,请参考以下文章

phpunit 找不到类,PHP 致命错误

PhpUnit 未显示 php 致命错误的堆栈跟踪

PhpUnit 未显示 php 致命错误的堆栈跟踪

基于 Swoft 协程框架的 PHP 微服务治理

php swoft的模型相关类库强化

swoft| 源码解读系列二: 启动阶段, swoft 都干了些啥?