php - C/PHP : How do I convert the following PHP JSON API script into a C plugin for apache?

标签 php c apache

我有一个 JSON API,我需要通过它提供对数据的超快速访问。

JSON API 根据提供的 GET 参数对数据库进行简单查询。

我已经优化了我的数据库,所以请不要推荐它作为答案。

我正在使用 PHP-APC,它通过保存字节码来帮助 PHP,但是 - 对于每秒被调用数十次的 JSON API(如我的日志所示),我需要减少大量 RAM消耗 PHP 正在消耗...以及用比 PHP 执行速度快得多的语言重写我的 JSON API。

我的代码如下。正如您所看到的,相当简单。

<?php

define(ALLOWED_HTTP_REFERER, 'example.com');

if ( stristr($_SERVER['HTTP_REFERER'], ALLOWED_HTTP_REFERER) ) {

 try {
  $conn_str = DB . ':host=' . DB_HOST . ';dbname=' . DB_NAME;
  $dbh = new PDO($conn_str, DB_USERNAME, DB_PASSWORD);
  $params = array();

  $sql = 'SELECT  homes.home_id,
      address,
      city,
      state,
      zip
    FROM homes
    WHERE homes.display_status = true
    AND homes.geolat BETWEEN :geolatLowBound AND :geolatHighBound 
    AND homes.geolng BETWEEN :geolngLowBound AND :geolngHighBound';

  $params[':geolatLowBound'] = $_GET['geolatLowBound'];
  $params[':geolatHighBound'] = $_GET['geolatHighBound'];
  $params[':geolngLowBound'] =$_GET['geolngLowBound'];
  $params[':geolngHighBound'] = $_GET['geolngHighBound'];

  if ( isset($_GET['min_price']) && isset($_GET['max_price']) ) {
    $sql = $sql . ' AND homes.price BETWEEN :min_price AND :max_price ';
    $params[':min_price'] = $_GET['min_price'];
    $params[':max_price'] = $_GET['max_price'];
  }

  if ( isset($_GET['min_beds']) && isset($_GET['max_beds']) ) {
    $sql = $sql . ' AND homes.num_of_beds BETWEEN :min_beds AND :max_beds ';
    $params['min_beds'] = $_GET['min_beds'];
    $params['max_beds'] = $_GET['max_beds'];
  }

  if ( isset($_GET['min_sqft']) && isset($_GET['max_sqft']) ) {
    $sql = $sql . ' AND homes.sqft BETWEEN :min_sqft AND :max_sqft ';
    $params['min_sqft'] = $_GET['min_sqft'];
    $params['max_sqft'] = $_GET['max_sqft'];
  }

  $stmt = $dbh->prepare($sql);

  $stmt->execute($params);
  $result_set = $stmt->fetchAll(PDO::FETCH_ASSOC);

  /* output a JSON representation of the home listing data retrieved */
  ob_start("ob_gzhandler"); // compress the output
  header('Content-type: text/javascript');
  print "{'homes' : ";

  array_walk_recursive($result_set, "cleanOutputFromXSS");
  print json_encode( $result_set );

  print '}';

  $dbh = null;
 } catch (PDOException $e) {
  die('Unable to retreive home listing information');
 }

}


function cleanOutputFromXSS(&$value) {
 $value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}


?>

我该如何开始将此 PHP 代码转换为 C,因为 C 在内存管理方面更好(因为您自己这样做)并且执行速度更快?

更新:

Facebooks HipHop自动为我完成所有这些?

最佳答案

有比用 c 重写更好的解决方案。 Memcached、添加更多内存、调整 php 都浮现在脑海中。

您需要分析您的应用程序,以查看 php 解释器有多少内存,压缩输出以及将整个 sql 结果集拉入内存有多少内存。

还记得那个叫 facebook 的小网站吗?他们使用 php,获得的流量比你的 API 更多。请记住这一点。

还要考虑一下编译此文件会对维护和稳定性造成的影响。现在,任何更改都将花费更长的时间,并且您必须关闭服务器才能进行部署。也许不是问题,但值得思考。

我敢打赌,有比您想象的更好的优化方法。分析是关键。

关于php - C/PHP : How do I convert the following PHP JSON API script into a C plugin for apache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2733566/

相关文章:

php - silverstripe 4 has_many 关系给出错误

c - MacOS brew install libsndfile 但还是找不到

apache:重写前的基本身份验证

apache - SSL 证书不可信任 (COMODO)

php - 在 Mac OSX 上使用 MAMP 时如何让 CakePHP bake 找到 mysql.sock 并识别 MySQL?

php - 为什么 php 在引用一个不存在的变量时不报错?

php - 使用 php mysql 将 csv 文件导入数据库

C - 使用 for 循环填充数组

android - OPEN GL ES 和 EGL 库之间的混淆

Django、mod_wsgi、psycopg2 配置不当 : Error loading psycopg2 module: No module named _psycopg