在 Arch Linux 上构建 PHP5.6.18:尽管 PHP_OS 检查,windows 测试未跳过

Building PHP5.6.18 on Arch Linux: windows test not skipped despite PHP_OS check

简短版

为什么这个来自官方 PHP 5.6.18 版本的未修改代码:

--SKIPIF--
<?php
if (phpversion() < "5.3.0") { die('SKIP php version so lower.'); }
if (!extension_loaded('openssl')) { die('ext/openssl required'); }
if(substr(PHP_OS, 0, 3) != 'WIN' ) {
        die('skip windows only test');
}
?>

...当我在 Arch Linux 上构建 PHP 包时,不会导致仅 windows 的测试被跳过 Linux?

长版

我正在尝试使用官方 Arch 构建系统中的 PKGBUILD 构建 PHP5.6.18。这是我所做的:

  1. git clone git://projects.archlinux.org/svntogit/packages.git
  2. 我把 git history of the php package, and identified this commit 作为最好的起点 - 基本上是升级到 PHP7 之前的最后一次提交。所以,我 cd 到 packagesgit checkout 提交 ID。
  3. 我像这样更新了 PKGBUILD:
    • 设置pkgver=5.6.18
    • 设置pkgrel=1
    • 设置第一个md5sum为'177ba962557795866ae331ad4ad99bba'
  4. setup clean chroot for building(这将测试失败从 2-3 减少到 1)
  5. 构建 php:makechrootpkg -c -r $CHROOT(在包含 PKGBUILD 文件的目录中。

构建工作正常,但我遇到以下测试失败:

Number of tests : 6651              6180
Tests skipped   :  471 (  7.1%) --------
Tests warned    :    1 (  0.0%) (  0.0%)
Tests failed    :    1 (  0.0%) (  0.0%)
Expected fail   :    9 (  0.1%) (  0.1%)
Tests passed    : 6169 ( 92.8%) ( 99.8%)
---------------------------------------------------------------------
Time taken      :   45 seconds
...
FAILED TEST SUMMARY
---------------------------------------------------------------------
mixed stream_socket_enable_crypto(resource $stream , bool $enable [, int $crypto_type [, resource $session_stream
]] ) ; [ext/standard/tests/streams/stream_socket_enable_crypto-win32.phpt]
=====================================================================

=====================================================================
WARNED TEST SUMMARY
---------------------------------------------------------------------
Bug #70172 - Use After Free Vulnerability in unserialize() [ext/standard/tests/serialize/bug70172.phpt] (warn: XFA
IL section but test passes)
=====================================================================

好的,所以 win32 在文件名中看起来已经很可疑了,查看文件内容确实表明应该跳过 Linux:

上的测试
--TEST--
mixed stream_socket_enable_crypto(resource $stream , bool $enable [, int $crypto_type [, resource $session_stream ]] ) ;
...
--SKIPIF--
<?php
if (phpversion() < "5.3.0") { die('SKIP php version so lower.'); }
if (!extension_loaded('openssl')) { die('ext/openssl required'); }
if(substr(PHP_OS, 0, 3) != 'WIN' ) {
        die('skip windows only test');
}
?>

注意 PHP_OS 相关检查。所以,我在想,也许 PHP_OS 以某种方式得到了错误的值。所以,我:

  1. 手动进入构建 chroot:arch-nspawn $CHROOT/$USER/
  2. 添加echo substr(PHP_OS, 0, 3) 到该测试的开头(就在 --FILE-- 部分的 <?php 下,在实际的 stream_socket_enable_crypto-win32.php 文件中)
  3. Re-运行 它使用同一目录中的 stream_socket_enable_crypto-win32.sh 脚本,我确实看到了预期的 Lin 输出。

为什么不跳过这个测试?我真的很困惑。我该如何解决这个问题?

作为解决方法,现在我将删除 PKGBUILD 文件的 prepare() 部分中的测试:

prepare() {
        cd ${srcdir}/${pkgbase}-${pkgver}
        # ....
        # add this line:
        rm ./ext/standard/tests/streams/stream_socket_enable_crypto-win32.phpt
}

如果 M01 能让我们知道他编辑的 PKGBUILD 文件的名称就好了,这样我也可以看一下。

但在那之前打开这个文件:

/usr/src/php/ext/standard/tests/streams/stream_socket_enable_crypto-win32.phpt

并找到如上所示的这一行。

如果有人还在 运行 php 5.3,就把这行注释掉吧,无论如何,他们应该被压缩和羽毛化哈哈。

  //commented out by dave due to bug and should be skipped
 //if (phpversion() < "5.3.0") { die('SKIP php version so lower.'); }