ErlangウィングでのPHPの飛行をシミュレートします

この記事では、完成したテクノロジーや製品の説明ではなく、「普遍的な幸福を実現するためにErlangとPHPをどのように交差させることができるか」というトピックに関する考察と空想を示します。 しかし、もちろん、尊敬する聴衆が落胆しない限り、これをオープンソースプロジェクトの形で実装するつもりです:)実際、この記事の主なタスクの1つは、PHPコミュニティがどれほど興味深いか潜在的に有用かを理解することです。 ところで、この記事で説明した問題のいくつかは、他の一般的なスクリプト言語(ここではRubyとPythonを意味します)でも有効であるため、提案されたソリューションはおそらくそれらに関連するでしょう。



背景

客観的および主観的な状況のため、PHPはMegaplanのサーバープログラミングの言語として使用されます。 時間が経つにつれて、PHPの制限のいくつかに制約され悩まされ始め、マルチスレッド、遅延開始、メッセージキューなどの「高度な」機能を見逃し始めました。 さらに、MegaplanはSaaSアプリケーションであるだけでなく、サーバーWindows、Linux、FreeBSDの3種類のOS向けのクロスプラットフォームボックス版の形で提供されるため、各問題に対するカスタムソリューションの使用に制限があります。 別のカスタムコンポーネントを追加すると(クロスプラットフォームソリューションが見つかった場合でも)、ボックスのインストールとサポートが大幅に複雑になります。 Windowsに通常の標準的なcrondがないことさえも迷惑です。



一般に、PHPを「ポンプ」する必要があります。 もちろん、代替の根本的な解決策があります-Javaに移行することですが、私たちにとってこれは選択肢ではありません-数年以内に多くの悪くないコードがすでに書かれています。 さらに、JVMが大規模な彗星の問題をエレガントに解決できるかどうかはわかりません。 はい。PHPを削除するのは時期尚早です。PHPは(少なくともロシアでは)Web開発で最も人気のある言語であり、プログラマーを見つけるのは他の言語よりも簡単です。



熟したニーズと、ある瞬間に目を引き、熟した問題を解決するというアイランが本当に好きだったという事実により、Erlang仮想マシンを標準環境に統合し、この関数型言語のユニークな機能でPHPの欠陥を補います。



まず、「純粋な」PHPの助けを借りてどのタスクが困難で、どの機能が欠けているかについて説明し、次に提案されたソリューションについて説明します。 だから...



問題

この記事では、PHPで長時間実行されるプロセスは非常に信頼性の低い松葉杖であるという事実から進めます。 PHP 5.3に通常のガベージコレクターがあるように思えても、それは期待できません。 多くの人が好むがlibeventに結び付けられているPhpDaemonは納得できないため、Windowsでは動作しません。 現時点では、PHPプログラムを「悪魔化」する通常のネイティブな、そして最も重要な、信頼できる方法はありません。 また、 FastCGIに切り替えようとしても、このエコノミーを介して定期的にプロセスを再開するディスパッチャーが必要です。 要するに、私の意見では、PHPの唯一のプロダクションモードは、従来のFastCGI(またはUNIXライクなシステムではapache + prefork + mod_php)だけです。



議論されるほとんどすべての制限は、この状況に関連しています。



バックグラウンドでの起動



PHPで「Hello World!」以上のことを書いた多くの開発者は、ユーザーのアクションに応じて電子メールを送信するという最も基本的なタスクなど、起動が遅れるという問題に直面しています。 PHPでは、このタスクに2つのソリューションがあります(両方ともい):

おなじみですか? たぶん、他の方法、たとえば、そのような倒錯があると主張するでしょう:pcntlを使用して新しいプロセスを分岐すること。 しかし、ここでは、これは少なくともクロスプラットフォームではなく、一般的にハックのように見えると答えます。 そして、私は美しく信頼できるソリューションが欲しいです。



彗星



もちろん、ロングポーリングやWebソケットなどの新しい機能はすべて純粋なPHPで実行できますが、接続ごとに長時間実行されるphpプロセスが必要です。 膨大な数の顧客リソースに対して、このような贅沢を十分に得ることはできません。

後ろの行で、カップル用のApacheでマルチスレッド(ワーカー)mod_phpについて示唆している人がいます。 皆さん、本番環境でスレッドセーフなphpを使用しないでください。これは間違っています。 さらに、非常に深刻な負荷では、これでも保存されません。
そして、クライアントとサーバーの間に共通のイベントスペースが必要です。 さて、この話を想像してください:サーバーがイベントをトリガーします:



<?php
    Event::publish( 'common.users.onlinecountchanged', array('count' => 10) );
?>

      
      





:



Event.subscribe( 'common.users.onlinecountchanged', function(data) {
    $('#onlinecount').html(data.count);
} );

      
      





, web-jabber-, .



cron



Cron- PHP-, cron' :

. , , , « cron' — - », , , PHP-.



,



(message queue)



— . , , , . , « » .



, , .



, PHP , , Erlang.



Erlang?

, , PHP- CMS YAWS (YAWS — -, Erlang') PHP Erlang', — , , , ! :)





, .



:

, .



— RabbitMQ



— , . « » , .



AMQP. , . , : . , PHP: , .



(pub-sub)



RabbitMQ pub-sub . , PHP , - . PHP ( PECL AMQP):



<?php
//   RabbitMQ
    $cnn = new AMQPConnection();
    $cnn->connect();
//  ,     
    $ex = new AMQPExchange( $cnn );
    $ex->declare( 'event-exchange', AMQP_EX_TYPE_TOPIC );
//  
    $ex->publish( 'message', 'some.object.event' );
?>

      
      





, - Erlang', some.object.event



REST: http://example.com/example-action



. Erlang, , ( -PHP, ):



//    
    amqp_declare_exchange( 'event-exchange', AMQP_EX_TYPE_TOPIC );
    amqp_declare_queue( 'external-app-queue' );
//         
    amqp_bind( 'external-app-queue', 'event-exchange', 'some.object.*' );
//     
    amqp_subscribe( 'external-app-queue' );
// ,       
    while ( 1 )
    {
        $msg = receive_message();
        file_get_contents( "http://example.com/example-action?msg=$msg" );
    }

      
      





, PHP- event-exchange



some.object.event



, , external-app-queue



, some.object.event



, . , , Erlang-, , callback' ( — REST- HTTP).

, :)


FastCGI



FastCGI- Erlang'? - . , php-fpm Windows, , , , , . - PHP, LAMP.



, , , .



- Comet



- Erlang' — (long-polling) — Erlang' . , comet -, .



Comet , , Erlang-- -, long-polling , http- push- . :

  1. Javascript- , .
  2. Erlang-, RabbitMQ , . , , .
  3. PHP- RabbitMQ, comet-, .
  4. , . push-.
  5. callback push- .
  6. Push- ( long-polling).




, , , , : , . :



Cron



Erlang. , . , , . Erlang' , , , (. ), . , AMQP, REST API .



, cron', , , ( , - ), , PHP (, ), , , PHP-.



, :)
, , :

, :)



? Welcome!



All Articles