如何使用PHP的set_include_path和多目录库

How to use PHP's set_include_path and multi directory library

所以我在一个项目中使用 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

这会导致 致命错误:Class 'Net_SFTP' 在 /var/www/test 中找不到。php...

然后我把phpseclib目录移到/tmp,改成set_include_path(get_include_path() . PATH_SEPARATOR . '/tmp/phpseclib');

$sftp = new Net_SFTP('10.0.0.15'); 仍然会导致 致命错误: Class 'Net_SFTP' not found in /var/www/test.php...

所以我的结构是: (/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');

...到每一个的顶部,一切顺利。我在做什么 wrong/missing?

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

Composer 由 phpseclib 推荐并且非常容易设置。 您可以从这里下载作曲家:https://getcomposer.org/download/

设置好作曲家后,接下来需要做的是在项目的根目录中创建一个 composer.json 文件。为您想要使用的任何版本分出 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);