我已经在 VPC 上安装了 Debian 6.0.6 x86,并且软件包尽可能少,当安装完成后,我会备份 VPC 并将其放在一边以供日后使用。
我已经通过安装了 PHP 5 aptitude install php5
,并创建了一个包含以下内容的 PHP 脚本文件,并将其命名为 test.php:
if ( function_exists("chroot") ) {
echo "Function works !\n";
} else {
echo "Function does NOT work !\n";
}
当我通过命令行运行脚本时,php -f test.php
它会向我显示功能有效!到目前为止一切都很好。
由于 php5 包中的 PHP 版本相当旧,因此我想编译自己的版本 - 目前是 5.4.13 - 因此我恢复了备份的 VPC 映像并使用以下参数对其进行编译:
./configure
--with-apxs2=/usr/bin/apxs
--with-config-file-path=/etc/php
--with-zlib-dir=/usr/local/zlib
--with-bz2=/usr/local/bzip2
--with-openssl=/usr/local/ssl
--with-curl=/usr/local/curl
--enable-mbstring
--enable-intl
输出显示:
Running system checks
checking for chroot... yes
并且编译、制作和安装都完美完成。
当我重新创建并运行 test.php 脚本时,我收到消息Function does NOT work !
。
这里发生了什么事,我问自己,我是否以错误的方式运行脚本,因为文档说明了以下内容:此功能仅适用于 GNU 和 BSD 系统,并且仅在使用 CLI、CGI 或 Embed SAPI 时可用。此外,此功能需要 root 权限。或者是否存在配置不正确的情况?
更新:
我尝试让这个 chroot 函数工作的原因是因为我想安装 Symfony2。当我php composer.phar create-project symfony/framework-standard-edition /var/www/symfony2
从/root
文件夹内运行时,它会抛出一个错误:
PHP Fatal error: require_once(): Failed opening required 'app/autoload.php' (include_path='.:/usr/local/lib/php') in /var/www/symfony2/vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Resources/bin/build_bootstrap.php on line 24
但是,当我通过 apt-get 管理器安装 php5 包并运行相同的 composer 命令时,它运行正常。使用预编译的 deb php5 包,脚本会将当前工作目录更改为,而/var/www/symfony2
我编译的 php 二进制文件则不会(我认为)。然后我发现我的 php 版本没有任何 chroot 功能,所以我认为这可能是罪魁祸首。
答案1
你已经准备好适合chroot
PHP 的chroot
了吗?
简单地设置一个任意目录是不够的 - 您实际上需要构建 chroot 并确保它包含所有必要的库、设备和二进制文件。
否则,DNS 解析等基本功能将无法正常工作,您将遇到随机错误、挂起或应用程序段错误。听起来您误认为open_basedir
chroot 的简单性。
首先,这个脚本一旦定制,就会为您提供 chroot 的基础。
http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/make_chroot_jail.sh
Dotdeb 已经包含 PHP 的预编译二进制文件
Dotdeb repo 保留了 PHP 最新版本的预编译版本 - 并且实现起来更加容易和快捷。
答案2
首先chroot()
,不是解决您的问题。请彻底了解chroot() 是什么,以及在尝试使用它之前它会做什么,否则你会毫无理由地让自己痛苦不堪。
解决问题所需要做的是设置 PHP 查找require
文件的路径(包含路径)。 有一个函数可以实现这个,或者您可以将其设置在 中php.ini
。
或者,从 Symfony 安装的根目录(您也在其中提取了框架)运行 Symfony 安装脚本 *,这正是您应该做的...