【问题标题】:How to use PHP's set_include_path and multi directory library如何使用 PHP 的 set_include_path 和多目录库
【发布时间】:2016-06-26 14:56:46
【问题描述】:

所以我在一个项目中使用PHP Secure Communications Library 2.0,它被用于许多地方(不同子目录中的不同文件)

目前,为了使其正常工作,我将 5 个目录和 1 个文件复制到每个子目录中,然后使用 include('Net/SSH2.php'); 包含在内,我确定这是不正确的。

文档说要使用以下内容:

set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
include('Net/SSH2.php');

但我无法让它工作。

我有一个文件/var/www/test.php,我有一个/var/www/phpseclib

到目前为止我做了什么。

ini_set('display_errors', 1);
echo get_include_path();  //Gets me .:
set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
include('Net/SSH2.php');

$sftp = new Net_SFTP('10.0.0.15');  //A valid IP for an SFTP host on the network

这会导致 致命错误:在 /var/www/test.php 中找不到类“Net_SFTP”...

然后我将 phpseclib 目录移动到 /tmp 并更改为 set_include_path(get_include_path() . PATH_SEPARATOR . '/tmp/phpseclib');

$sftp = new Net_SFTP('10.0.0.15'); 仍然导致 致命错误:在 /var/www/test.php 中找不到类“Net_SFTP”...

所以我的结构是: (/Users/jason/tmp 中所有文件的权限都已适当设置。)

/Users/jason/tmp/phpseclib
/Users/jason/tmp/phpseclib/Crypt
/Users/jason/tmp/phpseclib/File
/Users/jason/tmp/phpseclib/Math
/Users/jason/tmp/phpseclib/Net
/Users/jason/tmp/phpseclib/System
/Users/jason/tmp/phpseclib/openssl.cnf

/var/www/test.php
/var/www/A/two.php

我想在 test.phptwo.php 中都使用 phpseclib,我觉得我需要做的就是添加...

set_include_path(get_include_path() . PATH_SEPARATOR . '/tmp/phpseclib');
include('Net/SSH2.php');

...到每一个的顶部,并做好准备。我做错了什么/错过了什么?

【问题讨论】:

  • /tmp/ 中的文件每天都会根据askubuntu.com/a/759048/180177 自动删除。也许/var/www/phpseclib 会更好?另外,我也会仔细检查权限。确保 www-data 或任何运行 Apache 的用户可以访问该目录。
  • 其实……你用的是 git 的 2.0 分支吗?如果是这种情况,那么您不应该遵循phpseclib.sourceforge.net 上的指示 - 您应该使用自动加载器。作曲家是理想的,但你可以在没有作曲家的情况下做到这一点。请参阅phpseclib.sourceforge.net/2.0.html 了解更多信息。
  • @neubert 谢谢,我更新了问题,/tmp 是我懒惰。我正在使用 2.0 分支,所以我会检查自动加载器。

标签: php phpseclib


【解决方案1】:

在多个不同位置加载库的最简单方法是使用自动加载器。

Composer 是 phpseclib 推荐的,而且很容易设置。 您可以从这里下载作曲家:https://getcomposer.org/download/

完成 composer 设置后,接下来需要在项目的根目录中创建一个 composer.json 文件。 Sub out 2.0.* 用于您想使用的任何版本。

{
    "require": {
        "phpseclib/phpseclib": "2.0.*"
    }
}

可在此处找到可用版本:https://packagist.org/packages/phpseclib/phpseclib

创建此文件后,您需要在终端中运行这些命令之一,以生成自动加载库所需的一切。该命令将取决于您的系统是如何设置的。

composer install
        or
php composer.phar install

运行此命令后,将生成一个供应商文件夹,其中包含您指定的所有必需库。 (在这种情况下只是 phpseclib。)

需要进行的最后几项更改位于您的 index.php 文件中。

改变

set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
include('Net/SSH2.php');

require $_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php';
use \phpseclib\Net\SFTP;

这将允许您访问 phpseclib 文件夹中的 SFTP 功能。 此外,根据您使用的版本,某些术语已更改。

如果你使用的是 2.0.* 你需要改变

$sftp = new Net_SFTP($ihost);

$sftp = new SFTP($ihost);

【讨论】:

    猜你喜欢
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多