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

标签 php linux fork phar

我是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/

相关文章:

php - AJAX 加载整个页面而不是页面的一部分以从数据库加载数据

php - Cakephp 文本区域

php - 递归查找所有音频文件并随机播放

php - 如何隐藏html url,但需要从URL传递值

linux - 如何对缓慢的Linux服务器进行故障排除

Python subprocess.communicate() 不捕获简单二进制文件的输出

c++ - 我很困惑如何在这个使用 fork() 克隆进程的示例函数中处理这个 execvp()

python - 在 Linux 上使用 Python 从子进程中杀死父进程

c - linux自动删除文件

c - parent 从文件中读取操作, child 将其与 bc 相加