使用内置 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内置 SERVER开启web服务!

PHP 如何在drupal中使用Web服务

为啥我的 PHP 5.4 网络服务器无法使用 SQL Always On 与我的多子网故障转移集群通信?

PHP Drupal - 适应live&dev服务器的Settings.php

安装drupal对服务器环境的要求

php命令