gpt4 book ai didi

php - 进程 fork 期间 PHAR 内部损坏(crc32 不匹配)

转载 作者:行者123 更新时间:2023-12-02 01:21:21 25 4
gpt4 key购买 nike

我是ko-worker的开发者图书馆。我添加了 phar 可执行文件作为守护进程应用程序的功能。并发现 phar 和进程 forking undex linux 的奇怪行为。每次主进程 fork 超过 1 个子进程时,我都会收到这样的错误

include(phar:///opt/www/worker.phar/vendor/path/to/file.php): 
failed to open stream: phar error: internal corruption of phar

"/opt/www/worker.phar" (crc32 mismatch on file "vendor/path/to/file.php")
in `phar:///opt/www/worker.phar/vendor/composer/ClassLoader.php` line 412

phar 的 stub ( original stub here ) 看起来像

#!/usr/bin/env php
<?php
Phar::mapPhar('worker.phar');
require_once 'phar://worker.phar/vendor/autoload.php';

//Execute next going fork code more then one 1 time
...
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
} else if ($pid) {
// we are the parent
...
} else {
// we are the child
...
exit(1);
}

__HALT_COMPILER();

我不使用cache_list 。仅当 phar 使用 GZ 或 BZ2 压缩时才会发生这种情况。未经压缩的 Phar 文件不会重现此错误。是否有任何解决方法,或者可能是有关压缩 phars 和 fork 进程限制的一些信息?

最佳答案

PHP Phar 扩展在内部打开 Phar 文件,并在该描述符上使用查找/告诉/读取操作来从存档中读取所需的文件。由于 fork 进程都使用相同的描述符,因此也共享当前文件位置指针,因此这些操作之间存在竞争条件。

这个问题很容易重现,无论有没有压缩都会发生,但压缩会使这种情况更有可能发生。

我不确定这是否真的是一个错误,因为从 PHP 端修复它并不容易,并且任何在后台有打开文件描述符的 PHP 函数都可能存在同样类型的问题。这更多是文档的问题,没有明确说明对同一个 Phar 文件的所有操作在后台共享相同的文件描述符,即使从 PHP 代码中看不出来。

修复方法是确保在 fork() 之前不会访问 Phar,或者在从 fork() 创建的不同进程访问相同的 Phar 存档时使用某种锁定机制。

关于php - 进程 fork 期间 PHAR 内部损坏(crc32 不匹配),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29413013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com