在 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 的测试?

长版本

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

  1. git clone git://projects.archlinux.org/svntogit/packages.git
  2. 我浏览了 php 包的 git 历史记录,并将此提交确定为最佳起点 - 基本上是 uprev 到 PHP7 之前的最后一次提交。所以,我cd到packages,并git checkout提交ID。
  3. 我像这样更新了PKGBUILD:
    • 设置pkgver=5.6.18
    • 设置pkgrel=1
    • 将第一个 md5sum 设置为 '177ba962557795866ae331ad4ad99bba'
  4. 设置干净的 chroot 用于构建(这将测试失败从 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. 使用同一目录中的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.'); }