使用内置 PHP 5.4 服务器服务 Drupal 7
Posted
技术标签:
【中文标题】使用内置 PHP 5.4 服务器服务 Drupal 7【英文标题】:Serving Drupal 7 with built-in PHP 5.4 server 【发布时间】:2012-07-11 01:29:54 【问题描述】:我希望使用 php 的内置服务器开发 Drupal 7 站点。我已经成功运行 Drupal,但没有干净的 url(例如 index.php?q=/about/),但干净的 url(例如 /about/)通常依赖于 mod_rewrite 或其等效项.在我看到的文档中,您可以使用这样的路由器文件运行 PHP 服务器:
php -S localhost:8000 routing.php
在routing.php中应该放什么来模拟mod_rewrite?
【问题讨论】:
+1 回答一个有趣的问题。但是由于这是该站点的开发副本,您真的需要干净的 URL 吗? (我假设它是该站点的开发副本……您不应该将 PHP 的内置服务器用于实时系统!- 参见 php.net/manual/en/features.commandline.webserver.php) 是的,仅适用于开发人员。我使用 nginx 和 PHP-FPM 进行部署。我也时不时做一个 WordPress 网站,它也会有同样的问题。 在您的开发站点上设置 nginx 和 php-fpm 有什么问题?大约需要五分钟。 @MichaelHampton - 这也可能有效,但这不是问题。 @MichaelHampton - 最小的设置可以更轻松地跨计算机/虚拟机工作。上次我检查时,特别是 PHP-FPM 在 Windows 上不起作用。 【参考方案1】:任务基本上是在 PHP 中为您的router.php
文件编码 Drupal 的 .htaccess。
这是一个开始:
<?php
if (preg_match("/\.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)/", $_SERVER["REQUEST_URI"]))
print "Error\n"; // File type is not allowed
else
if (preg_match("/(^|\/)\./", $_SERVER["REQUEST_URI"]))
return false; // Serve the request as-is
else
if (file_exists($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SCRIPT_NAME"]))
return false;
else
// Feed everything else to Drupal via the "q" GET variable.
$_GET["q"]=$_SERVER["REQUEST_URI"];
include("index.php");
这应该被视为 alpha 质量。它表示浏览 Drupal 7.14 的 .htaccess 文件 3 分钟,跳过任何需要超过 10 秒思考的内容。 :)
然而,它允许我启动 Drupal 的安装脚本,按预期加载样式表、JS 和图像,并使用 Clean URLs 访问 Drupal 的页面。请注意,要在此环境中安装 Drupal,我需要a patch,它可能不会成为 Drupal 7 的一部分。
【讨论】:
看起来不错。您应该提交一个补丁以将其包含在 Drupal 中。 在正常请求中,SCRIPT_NAME 是 index.php,这意味着永远不会执行最后一个 else 语句。 @JasonChrista - 是的。如果我们正在处理对index.php?q=admin
的请求,我们可能不想进一步处理。我没有看到什么吗?
我的意思是 SCRIPT_NAME 填充有 index.php
以及对 /about/
等 URL 的请求。
另一个奇怪的是,弹出的管理员只显示管理员的首页,但不显示任何子页面。不过,转到/admin/
效果很好。【参考方案2】:
您现在可以使用以下命令更轻松地启动服务器:
drush runserver
【讨论】:
这是唯一对我有用的答案。drush
必须是 drush.phar
的别名或符号链接,否则您会收到关于无法在 phar 中找到文件的错误。【参考方案3】:
我自己也在寻找解决方案,在Drupal 8 issues中找到了一个:
现在在我现有的 Drupal 7 安装中这对我来说非常有用:
将它保存为 .htrouter.php(或任何你想要的)并在你的 Drupal 根目录中运行:
php -S localhost:8080 .htrouter.php
<?php
/**
* @file
* The router.php for clean-urls when use PHP 5.4.0 built in webserver.
*
* Usage:
*
* php -S localhost:8888 .htrouter.php
*
*/
$url = parse_url($_SERVER["REQUEST_URI"]);
if (file_exists('.' . $url['path']))
// Serve the requested resource as-is.
return FALSE;
// Remove opener slash.
$_GET['q'] = substr($url['path'], 1);
include 'index.php';
(从https://drupal.org/files/router-1543858-3.patch构建的sn-p)
【讨论】:
以上是关于使用内置 PHP 5.4 服务器服务 Drupal 7的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 PHP 5.4 网络服务器无法使用 SQL Always On 与我的多子网故障转移集群通信?