【问题标题】:Optimizing memory usage of multi-threaded PHP application. Is APC or another memory caching technology appropriate?优化多线程 PHP 应用程序的内存使用。 APC 或其他内存缓存技术是否合适?
【发布时间】:2013-02-14 12:51:15
【问题描述】:

我猜这个问题与PHP cli Memory usage optimization的主题相似,但是当发布者发现一个简单的编码错误时,这个问题就解决了。

我有一个连续运行的多线程 PHP (CLI) 应用程序。我正在尝试优化内存使用,因为每个线程使用的内存量限制了我在任何给定时间可以运行的线程数(因为我有有限的可用内存量)。经过一番调查,似乎每个线程进程使用的最小内存量约为 1.3MB。似乎有点高,但经过一番挖掘后,似乎 PHP 以大约 0.5MB 的块分配内存。我怀疑我的应用程序是否足够精简以使用不到 0.5MB,但我想尝试一下。如果可能的话,即使将占地面积减少 10-20% 也很好。

我正在考虑的一个选项是使用 APC 在内存中缓存一些数据。作为一种减少内存的技术,这似乎违反直觉,但目前我非常频繁地调用 MySQL 数据库来存储和检索数据。这是一个小例子:

<?php
function get_stored_token(){
    connect_db();

    $query_result = mysql_query("select token from tokens");
    if ($query_result == true){
           $query_result_array = mysql_fetch_row($query_result);
           $token = $query_result_array[0];
           unset($query_result, $query_result_array);
           return $token;
    }
    else {
           echo "Problem with query to get stored token!\n";
    }
}

以这种方式使用 MySQL 似乎有很多内存开销。这通过调用pmap -d PID | grep mysql 得到证实,尤其是libmysqlclient_r.so.16.0.0 正在使用大量内存。因此,也许一种在内存中缓存键/值对的简单技术实际上在内存方面会更轻?然而,我没有这方面的经验,所以我想在更多地尝试 APC(或其他一些缓存技术)之前听到关于这个想法的反馈。

欢迎任何其他关于如何在 PHP 中优化内存使用的想法!

【问题讨论】:

    标签: php memory-management apc


    【解决方案1】:

    我个人会使用 memcached 进行数据库交互,这将大大提高线程处理能力。它可能不会减少整体内存使用量,但会提高执行速度,因此您应该能够更快地打开和关闭线程或更好地交叉调度线程,而不是同时进行所有事情。
    如果 2 个进程每个花费 1 分钟,现在每个进程花费 30 秒,那么这两个进程的内存使用量可能会翻倍,并且每个进程只使用 30 秒,现在总体上仍然是一分钟,但执行速度更快。

    【讨论】:

      【解决方案2】:

      为什么你不使用 WHERE 术语?在 SQL 中,这部分确定将加载到 php 的行数,如果您正在寻找数据库中的第一个/最后一个 id,请为此使用 SQL 函数。一般来说,将 SQL 数据传递给 php 会消耗内存。

      我认为,如果这是一个仅为所有用户选择而不是由用户修改的表,Memcahe 将对此有用。 Memcashe PHP

      【讨论】:

      • 在这个特定的表中,只有一行。所以我不确定 where 子句会有所帮助。不过我可以试试……
      猜你喜欢
      • 2014-07-27
      • 2015-07-05
      • 2011-04-03
      • 1970-01-01
      • 2011-08-20
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多