实现一个100%可移植的php应用程序
我正在寻找一种方法,使我的PHP应用程序能够完全可移植。我的问题是,尽管我使用相对路径来包含PHP类,但当我尝试在新环境中部署我的应用程序时,我总是会遇到问题 例如,我在Ubuntu下实现了一个应用程序,它运行得非常好。然而,当我将它移动到运行Centos的共享主机时,我不得不修改所有的include语句 因此,我想知道包含类的最佳方式,考虑到有多个文件夹,其中包含不同的类,这些类依赖于文件夹层次结构中不同级别的其他多个类。只需保留一个“主”文件夹即可 在index.php(例如)中,配置“main”文件夹位置,并将其用作include的“base”(我想您需要硬编码include/require路径?) 否则在自动加载功能中使用“基本” 现在您可以移动“main”文件夹,只需更新index.php中的一行代码即可 它仍然是一个手动更新。没错。你也可以选择ofc。使用glob()之类的工具搜索“mainlib.php”文件(例如)并“缓存”文件夹位置,以便在下次调用中使用它?实现一个100%可移植的php应用程序,php,deployment,include,hierarchy,Php,Deployment,Include,Hierarchy,我正在寻找一种方法,使我的PHP应用程序能够完全可移植。我的问题是,尽管我使用相对路径来包含PHP类,但当我尝试在新环境中部署我的应用程序时,我总是会遇到问题 例如,我在Ubuntu下实现了一个应用程序,它运行得非常好。然而,当我将它移动到运行Centos的共享主机时,我不得不修改所有的include语句 因此,我想知道包含类的最佳方式,考虑到有多个文件夹,其中包含不同的类,这些类依赖于文件夹层次结构中不同级别的其他多个类。只需保留一个“主”文件夹即可 在index.php(例如)中,配置“ma
例如,我就是这样做的:
<?php
/**
* cfg.php
*
* Main config file
*
* @package Public
*/
// Compatibility
$version = '5.2.3';//restricted by htmlentities()' 4th parameter
if(version_compare(PHP_VERSION, $version, '<')) {
die('Required PHP version is ' . $version . ', current is ' . PHP_VERSION);
}
// Environment
define('DEVELOPMENT', in_array($_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1')));
define('PRIVATE_DIR', DEVELOPMENT ? 'private' . DIRECTORY_SEPARATOR : '..'.DIRECTORY_SEPARATOR.'private_html'.DIRECTORY_SEPARATOR.'tickets');
define('APPLICATION_LINK','application_red'.DIRECTORY_SEPARATOR);
define('LIBRARY_LINK','library'.DIRECTORY_SEPARATOR);
define("MEM_START",memory_get_usage(true));
// Behavior
if(DEVELOPMENT) {
ini_set('display_errors', 'On');
error_reporting(E_ALL | E_STRICT);//report all errors
}
else {
ini_set('display_errors', 'Off');
error_reporting(0);
}
// Timezone
date_default_timezone_set('Europe/Amsterdam');
// Constants
define('ROOT', dirname(__FILE__) . DIRECTORY_SEPARATOR);
define('APP', ROOT . '..'.DIRECTORY_SEPARATOR.PRIVATE_DIR.''.APPLICATION_LINK);
define('LIB', ROOT . '..'.DIRECTORY_SEPARATOR.PRIVATE_DIR.''.LIBRARY_LINK);
define('CACHE', APP.'cache'.DIRECTORY_SEPARATOR);
您根本不需要引用硬连线文件夹。在我当前的项目中,我会这样做:
public static function getProjectRoot()
{
return realpath(
dirname( __FILE__ ) . DIRECTORY_SEPARATOR . '..' .
DIRECTORY_SEPARATOR . '..'
);
}
此功能所在的类是项目中的两个文件夹级别-因此是两个。。运算符向上遍历目录结构。因为该位置相对于项目根永远不会改变,所以不需要改变,我也不需要硬连线任何路径
编辑:对于include/require语句,使用自动加载器,并且(除了两个引导文件外)您通常根本不需要使用include/requires。@DamienPirsy:是的,因为例如,在一台机器中它将是“/var/www/myapp”,而在另一台机器中则是“/var/username/www/myapp”。在某些情况下,也许“/var/username/www/myapp”,但index.php并不是我所有文件的起点。我将有这样的文件:index.php add.php download.php control.php等等。我不想将主文件夹位置放在所有文件夹中。在同一根文件夹中使用类似config.php的内容吗?在你的其他文件中包含那个文件?我在寻找更好的解决方案。无论如何,谢谢你的回答。因为这是这里唯一合理的答案,我会接受它。我已经用我的真实生活例子更新了我的答案,说明我是如何用我的框架来做的。它在我运行的任何服务器上运行。在windows和linux上都是如此。而且,我总是至少等一天才接受答案。但是还是要感谢:-)顺便说一句,您也可以使用\uuuu DIR\uuuu
,但只能从PHP5.3开始使用。在Apache中进行重写时,我在使用DIR时遇到了一些问题。特别是使用/project/path/index.php
通过URI使用/project/path/api/index.php
,例如localhost:5000/api/v1/something
,它使用中的include。我认为最好的解决方案确实是使用硬编码的rootpath变量,您只需在不同的环境/服务器中更改它,然后将其用作所有包含的根。@juhaftinen:这很奇怪,\uuuu DIR\uuu
不应该受到mod\u rewrite
的影响。它用于遍历目录结构,而不是URL结构。
public static function getProjectRoot()
{
return realpath(
dirname( __FILE__ ) . DIRECTORY_SEPARATOR . '..' .
DIRECTORY_SEPARATOR . '..'
);
}