在 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。这是我所做的:
git clone git://projects.archlinux.org/svntogit/packages.git
- 我把 git history of the php package, and identified this commit 作为最好的起点 - 基本上是升级到 PHP7 之前的最后一次提交。所以,我 cd 到
packages
和 git checkout
提交 ID。
- 我像这样更新了 PKGBUILD:
- 设置
pkgver=5.6.18
- 设置
pkgrel=1
- 设置第一个md5sum为
'177ba962557795866ae331ad4ad99bba'
- setup clean chroot for building(这将测试失败从 2-3 减少到 1)
- 构建 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 以某种方式得到了错误的值。所以,我:
- 手动进入构建 chroot:
arch-nspawn $CHROOT/$USER/
- 添加
echo substr(PHP_OS, 0, 3)
到该测试的开头(就在 --FILE--
部分的 <?php
下,在实际的 stream_socket_enable_crypto-win32.php
文件中)
- 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.'); }
简短版
为什么这个来自官方 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。这是我所做的:
git clone git://projects.archlinux.org/svntogit/packages.git
- 我把 git history of the php package, and identified this commit 作为最好的起点 - 基本上是升级到 PHP7 之前的最后一次提交。所以,我 cd 到
packages
和git checkout
提交 ID。 - 我像这样更新了 PKGBUILD:
- 设置
pkgver=5.6.18
- 设置
pkgrel=1
- 设置第一个md5sum为
'177ba962557795866ae331ad4ad99bba'
- 设置
- setup clean chroot for building(这将测试失败从 2-3 减少到 1)
- 构建 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 以某种方式得到了错误的值。所以,我:
- 手动进入构建 chroot:
arch-nspawn $CHROOT/$USER/
- 添加
echo substr(PHP_OS, 0, 3)
到该测试的开头(就在--FILE--
部分的<?php
下,在实际的stream_socket_enable_crypto-win32.php
文件中) - 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.'); }