none
Windows azure 上の PHP ⇔ Memcheced連携について RRS feed

  • 質問

  • Windows Azure上でPHPプログラムからMemcachedを呼び出すプログラムを作成したいです。

    Sampleコード等が見当たりません。どなたか開発実績がありましたら、情報をご提供願います。

    また、Memcachedを配置する場所をPHPのWEBロールのWokerRollとすべきか。

    別のホスト上にMemcachedを配置するべきか情報を提供願います。

    2012年2月23日 8:13

回答

  • こんにちは。

    Windows Azure Memcached Solution AcceleratorだとMemcachedの使用ポートはランダムなようです。
    ※アクセラレータ内だとAzureの環境変数(RoleEnvironment)から取得するので問題なさそうですが

    なので11211固定ではないため失敗すると思われます。

    SDK1.3以降だとServiceDifinition.csdefファイル内のInternalEndpointでポート指定ができたと思いますので、そちらで11211等を指定するとよいかと思います。

    例:

          <InternalEndpoint name="memcached" protocol="tcp" port="11211"/>

    ※InternalEndpointなので同一ホストサービス内でしか利用できません

    参考までにMemcached Solution Acceleratorは古いのでSMarxのMemcached Roleを使う等もよいかもしれません。

    http://blog.smarx.com/posts/memcached-in-windows-azure

    ※どちらも継続メンテナンスされてなさそうですけどまだSMarxの方が新しいです

    • 回答としてマーク kk1205 2012年3月7日 1:20
    2012年2月27日 1:34
    モデレータ

すべての返信

  • こんにちは。

    Windows上のPHPからMemcachedにアクセスする場合、php_memcache.dllを追加でインストールする必要があります。
    Windows Azure上にWebPI等でPHPをインストールした場合、上記のDLLを個別にPHPのExtensionsフォルダにコピー後、PHP.iniを編集してmemcachedの拡張を有効にする必要があります。
    ※PHPのランタイム等をすべてパッケージングするのであれば一緒に含めておきます。

    PHPからの操作方法はAzure云々特に関係なく一般的なコードで問題ないかと思います。

    Memcachedサーバーの配置先ですが、要件によりけりかと。WebRoleのインスタンスに余力があれば同居でもいいですし、Memcachedのクラスタを構成するのであれば別ロールにするなどのほうが良いかと思います。

    2012年2月23日 8:32
    モデレータ
  • 返事がおそくなりすみません。

    ご回答ありがとうございます。

    下記の通り環境構築しました。

    ①Windows Azure Memcached Solution Accelerator(http://archive.msdn.microsoft.com/winazurememcached)

    を使用しWEBロール、workerロールを作成。

    ②別プロジェクトでPHP側にphp_memcache.dllをインストールし、①で作成したMemcachedを操作するロジック記述。

    結果

    Memcachedへのconnectは成功する。(ポート80番。)

    Memcachedへのsetに失敗する。

    エラー:Failed reading line from stream (0)

    原因:

    Memchedのtcpポート(11211)にうまくつながらない事が原因だとかんがえていますが、

    web.configのポートやMemcachedの使用ポートいじっていろいろ試してみましたが上手くいっていません。

    なにか思い当たる解決方法がありましたら、ご教授いただければ・・・

    お願い致します。




    • 編集済み kk1205 2012年2月27日 1:17
    2012年2月27日 0:58
  • こんにちは。

    Windows Azure Memcached Solution AcceleratorだとMemcachedの使用ポートはランダムなようです。
    ※アクセラレータ内だとAzureの環境変数(RoleEnvironment)から取得するので問題なさそうですが

    なので11211固定ではないため失敗すると思われます。

    SDK1.3以降だとServiceDifinition.csdefファイル内のInternalEndpointでポート指定ができたと思いますので、そちらで11211等を指定するとよいかと思います。

    例:

          <InternalEndpoint name="memcached" protocol="tcp" port="11211"/>

    ※InternalEndpointなので同一ホストサービス内でしか利用できません

    参考までにMemcached Solution Acceleratorは古いのでSMarxのMemcached Roleを使う等もよいかもしれません。

    http://blog.smarx.com/posts/memcached-in-windows-azure

    ※どちらも継続メンテナンスされてなさそうですけどまだSMarxの方が新しいです

    • 回答としてマーク kk1205 2012年3月7日 1:20
    2012年2月27日 1:34
    モデレータ
  • 回答ありがとうございます。

    なるほど、外部からだと使用ポートがランダムになってしまうんですね・・・

    それは動かないはずだ・・

    SMarxのMemcached Role試してみます。

    ありがとうございます。

    2012年2月27日 1:42
  • こんにちは。

    補足しておきますと、InternalEndpoint はそもそもホストサービス外(外部)からは接続できません。(ロール内部専用です)

    InputEndpointにすれば外部と通信できます。(その場合もportと内部のLocalPortを両方指定しておいた方がよいかと思います。※その場合外部にMemcahcedをさらすことになりますが


    2012年2月27日 1:52
    モデレータ