C / PHP: nasıl aşağıdaki PHP JSON API komut apache için bir C eklentisi haline dönüştürebilirim?

2 Cevap php

Ben ile benim verilere süper hızlı erişim sağlamak için gereken bir JSON API var.

JSON API sadece sağlanan GET parametrelere dayalı veritabanı karşı sorgu yapar.

Ben zaten bir cevap olarak önermiyoruz lütfen, benim veritabanını optimize ettik.

Ben bayt kodu kaydederek PHP yardımcı PHP-APC, kullanıyorum, AMA - (benim günlükleri tarafından belirtildiği gibi) saniyede kez tam anlamıyla onlarca çağrıldığını bir JSON API için, ben PHP büyük RAM tüketimini azaltmak gerekir tüketen ... gibi PHP çok daha hızlı yürütmek bir dilde benim JSON API yeniden.

Benim kod aşağıda. Gördüğünüz gibi, oldukça yalındır.

<?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');
}


?>

C bellek yönetimi hem de daha iyi olduğu nasıl, C üzerinde bu PHP kodu dönüştürme başlayacak (kendiniz bunu beri) ve yürütmek için çok, çok daha hızlı?

UPDATE:

Facebooks HipHop benim için otomatik olarak tüm bu yapardın?

2 Cevap

C bu yeniden daha iyi çözümler vardır. Daha fazla bellek ekleyerek, Memcached, tuning php tüm akla gelen.

Sen kadar bellek php tercüman nasıl olduğunu görmek için app profil gerekiyor ve ne kadar çıktı sıkıştırarak ve belleğe ayarlanmış tüm sql sonucu çekerek değil.

Küçük site facebook denilen hatırlıyor musun? Onlar php kullanmak ve API yolu daha trafik olsun. Bunu aklınızda tutun.

Ayrıca bu derleme alacak vurdu bakım ve istikrar düşünüyorum. Herhangi bir değişiklik, şimdi artık büyüklükte siparişleri alacak ve dağıtmak için sunucu aşağı çekmek zorunda. Belki bir sorun değil, ama düşünmek için bir şey.

Ben ne düşündüğünü daha iyi duruma getirmek için daha iyi yollar vardır bahse girerim. Profilleme anahtarıdır.

Kendi Apache modülü yazabilirsiniz.

Here is a tutorial: http://threebit.net/tutorials/apache2_modules/tut1/tutorial1.html