【发布时间】:2017-12-02 16:04:24
【问题描述】:
我在 Windows 10 机器上运行 XAMPP(版本 7.0.18)。我的桌面上有一个名为“site”的文件夹,其中包含“DocumentRoot”文件夹。 “DocumentRoot”文件夹的路径在 httpd.conf 文件中设置:
DocumentRoot "C:\Users\Username\Desktop\site\DocumentRoot"
<Directory "C:\Users\Username\Desktop\site\DocumentRoot">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
</Directory>
我正在尝试在“DocumentRoot”文件夹中的 HTML 文件中使用 AJAX 来返回来自 PHP 文件的响应。如果 PHP 文件位于“DocumentRoot”文件夹中,它可以正常工作,但如果它位于“DocumentRoot”文件夹之外(例如 C:\Users\Username\Desktop\site\includes)并被另一个包含PHP 文件位于“DocumentRoot”文件夹中。例如,我尝试了在 php.ini 文件中设置的以下 include_path:
include_path = ".;c:\Users\Username\Desktop\site\includes"
尽管在 php.ini 文件中将 error_reporting 设置为 E_ALL,但返回的唯一错误是通过 PHP 错误日志(似乎与脚本超时有关 - memory_limit 设置为 1M 以减少 PHP 错误之前的时间)呈现):
“PHP Fatal error: Allowed memory size of 2097152 bytes exhausted (tried to allocate 4096 bytes) in C:\Users\Username\Desktop\site\DocumentRoot\test.php on line 1.”
从包含文件夹中删除/重命名 PHP 文件以及删除/重命名包含文件夹本身对错误没有影响。我希望看到一些错误,指出找不到文件或目录,但没有。
我是 XAMPP 的新手,无法弄清楚这一点。虽然我没有在生产服务器上尝试过这种确切的情况,但我过去使用过 AJAX,在生产服务器上没有出现此类问题。任何建议将不胜感激。
更新 1
“DocumentRoot”文件夹(“test.php”)中的 PHP 文件试图将 PHP 文件包含在“DocumentRoot”文件夹(“test-process.php”)之外,在第 1 行具有以下内容:
<?php include 'test-process.php'; ?>
更新 2
我尝试在“test.php”文件中使用“include_once”(而不是“include”)并且没有给出错误。因此,“允许的内存大小...”错误可能是由于尝试重复包含“test-process.php”文件引起的。
但我仍然不明白为什么没有给出错误。我什至可以将 include_path 更改为不存在且不给出错误的内容。
更新 3
为了响应 cmets,创建了“test.php”和“test-process.php”作为一个简单的测试用例。如上面“更新 1”中所述,“test.php”文件只有一行代码和包含语句。 “test-process.php”文件具有以下内容,以 JSON 格式返回消息:
<?php
$output['message'] = 'Hello World';
echo json_encode($output);
?>
【问题讨论】:
-
Allowed memory size of ### bytes exhausted与错误包含的文件无关。检查这个文件在做什么。似乎您正在尝试向内存中添加太多信息(例如,具有太多信息的数组) -
我的更新显示它只是试图包含一个 PHP 文件。正如我在最初的问题中提到的那样,无论“test-process.php”文件(试图被包含)是否存在,都会给出错误,所以该文件试图做什么似乎无关紧要。
-
仅通过包含 PHP 文件是不可能达到内存限制的。你的文件在做什么?如果没有过度使用数组,请检查所有循环。尽可能频繁地取消设置/重置变量。
-
唯一涉及的文件是“test.php”和“test-process.php”文件。我已经更新了问题以显示“test-process.php”文件的内容。没有循环或其他代码。关于您关于单独包含无法达到内存限制的评论,知道为什么在使用“include_once”与“include”时不会引发错误吗?