【问题标题】:Efficient handling of IO in PHPPHP中IO的高效处理
【发布时间】:2016-05-26 00:54:18
【问题描述】:

我正在使用 php,并处理文件操作。我的服务器需要响应每个客户端请求(同时至少 5000 个客户端),我的服务器打开一个 xml 文件并将 xml 转换为 php 数组,并将作为 json 文件进行一些计算和响应,为此我使用下面的代码

$xmlstring = file_get_contents("../api/rate.xml");
$xml = simplexml_load_string($xmlstring);
$rate_json = json_encode($xml);
$rate_array = json_decode($rate_json, true);
$return_rates = array();
$return_rates['Baserates'] = $rate_array['Baserates'];
/* Here i will do some process and create $return_rates array */
$return_rates = json_encode($return_rates);
echo $return_rates;

此代码根据我的需要产生结果,但由于处理 IO 问题(我的服务器人员说这个问题是内部服务器错误),我收到了 500 次内部服务器错误。当读取文件时发生多个并发访问时会发生此问题,请帮助任何一次解决此问题。

XML 文件将由第三方应用程序生成。每一秒我都会从我的第三方应用程序中收到这个 XML 文件。

【问题讨论】:

    标签: php json xml codeigniter


    【解决方案1】:

    仅当 rate.xml 更改时,您才需要执行此代码。第一次,使用哈希值检查 rate.xml 内容是否发生了变化。如果哈希值与上次检查的哈希值不同,则执行以下代码并将 json 文件存储在本地存储和新的哈希值中。

    $xmlstring = file_get_contents("../api/rate.xml");
    $xml = simplexml_load_string($xmlstring);
    $rate_json = json_encode($xml);
    

    否则你只需要读取本地 json 文件并对其进行解码。或者您可以直接从 $xml 读取而不调用 json_encode。或者您可以请求第三方应用程序开发人员添加 JSON 输出而不是 XML。

    也可以代替 file_get_contents(),使用 cUrl 并先发送 HTTP HEAD 来查找 rate.xml 大小是否发生变化,而不是直接读取 rate.xml 内容。当它们发生变化时,您可以调用 HTTP GET 来检索它们的内容。

    目标是最小化网络 I/O 和文件 I/O。尽可能在本地存储或 RAM 中尝试缓存 rate.xml(尝试 Redis 或 Memcached)

    【讨论】:

    • 我使用wincache(因为php在windows iis server中运行)来存储rate.xml,但仍然有一些时候发生内部服务器错误。
    • 先尝试从 IIS 日志文件中调查。日志告诉你什么?
    猜你喜欢
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 2022-10-05
    • 2021-09-13
    • 2011-05-29
    • 2023-02-09
    • 1970-01-01
    • 2010-10-29
    相关资源
    最近更新 更多