解决方案: 升级swoole至最新
create
或者 Parallel
进行创建新的协程进行消费,在DBconnect中会判断当前协程是否已经有链接,如果检查到有链接会调用defer
进行release
操作,判断是否在事务内,如果在,则立即回滚providers/EventServiceProvide
的$listen 中 监听 JobProcessed
和 JobExceptionOccured
这两个分别为job执行成功和失败的操作。建立QueueRollbackListener
。写入以下代码:public function handle()
{
$connection = Db::connection();
if ($connection->transactionLevel() > 0) {
$connection->rollback(0);
}
}
PHP
Copy
waitgroup
,Parallel
等内容进行阻塞<?php
use HyperfUtilsExceptionParallelExecutionException;
use HyperfUtilsCoroutine;
use HyperfUtilsParallel;
$parallel = new Parallel();
$parallel->add(function () {
sleep(1);
return Coroutine::id();
});
$parallel->add(function () {
sleep(1);
return Coroutine::id();
});
try{
// $results 结果为 [1, 2]
$results = $parallel->wait();
} catch(ParallelExecutionException $e){
// $e->getResults() 获取协程中的返回值。
// $e->getThrowables() 获取协程中出现的异常。
}
PHP
Copy
可以忽略此错误。这个错误就是 socket_buffer_size 选项过大,个别系统不接受,并不影响程序的运行。mac会偶现这种情况,Bsd系统不支持
当碰到修改后的代码不生效的问题,请执行以下命令
composer dump-autoload -o
Bash
Copy
开发阶段,请不要设置 scan_cacheable
为 true,它会导致 收集器缓存
存在时,不会再次扫描文件。 当环境变量存在 SCAN_CACHEABLE
时,.env
中无法修改这个配置。
执行·
COMPOSER_MEMORY_LIMIT=-1 composer install
Bash
Copy
当项目启动时,抛出类似于以下错误时
Fatal error: Uncaught PhpParserError: Syntax error, unexpected T_STRING on line 27 in vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php:315
可以执行脚本 composer analyse
,对项目进行静态检测,便可以找到出现问题的代码段
因为他会在框架启动前去链接一次
例如在处理中间件时忘记注入上下文,导致当前获取的上下文内容不属于此协程
会导致与结果不符,可以使用协程上下文Context作为管理。
lsof -i:端口号
查看进程id,kill掉并重启config/autoload/dependencies.php
中进行替换在传统的 PHP-FPM 的框架里,会习惯提供一个 AbstractController
或其它命名的 Controller 抽象父类
,然后定义的 Controller
需要继承它用于获取一些请求数据或进行一些返回操作,在 Hyperf 里是 不能这样做 的,因为在 Hyperf 内绝大部分的对象包括 Controller
都是以 单例(Singleton)
形式存在的,这也是为了更好的复用对象,而对于与请求相关的数据在协程下也是需要储存到 协程上下文(Context)
内的,所以在编写代码时请务必注意 不要 将单个请求相关的数据储存在类属性内,包括非静态属性。
当然如果非要通过类属性来储存请求数据的话,也不是没有办法的,我们可以注意到我们获取 请求(Request)
与 响应(Response)
对象时是通过注入 HyperfHttpServerContractRequestInterface
和 HyperfHttpServerContractResponseInterface
来获取的,那对应的对象不也是个单例吗?这里是如何做到协程安全的呢?就 RequestInterface
来举例,对应的 HyperfHttpServerRequest
对象内部在获取 PSR-7 请求对象
时,都是从 协程上下文(Context)
获取的,所以实际使用的类仅仅是一个代理类,实际调用的都是从 协程上下文(Context)
中获取的。
相对路径 DIR 时,会碰到的问题。请尽量使用 BASE_PATH 常量。
使用随机数时需要重新播种。也可使用random_int获取真实随机数不需要重新播种
例如:
$values = array_map(
static function ($value) {
return empty($value) ? '""' : $value;
}, $values
);
PHP
Copy