カテゴリー「php」

mysqlサーバが突然死して、

クライアント側から見ると生きている状態、つまりハーフCLOSE状態となるのだが、

このとき、他のmysqlサーバに接続している状態で、上記が発生すると、

生きている側のmysqlサーバへの接続がCLOSEされない待ち状態となることがある。

HTTPアクセスからだと、以下のような場合が該当する。

  1. mysqlサーバAにconnect
  2. mysqlサーバBにconnect
  3. mysqlサーバAにbegin
  4. mysqlサーバBにbegin
  5. mysqlサーバAにselect for update
  6. mysqlサーバBにselect
  7. mysqlサーバBが突然死
  8. HTTP要求がタイムアウト

このとき、6の応答を待ったまま、処理が続行され、

5のロックが解除されない状態となる。

5のロックを解除するには、

  • mysqlサーバAからプロセスをkillする
  • HTTPサーバを再起動する
  • 実行タイムアウトまで待つ

という方法のいずれかになる。

JDBCではsocketTimeoutといういわゆる実行タイムアウトがあるのだが、

phpのPDOでは、デフォルトで実行タイムアウトの概念はない。

set session 〜 で対応するくらいになるだろう。

しかし、set session 〜 で出来ることは、mysqlサーバのクエリー実行時間の制御であり、

クライアント側のタイムアウト制御はできない。

そこで、あのmysqlndを使っているのであれば、

mysqlnd.net_read_timeout

というパラメータを設定することで、実行タイムアウト例外を検知できるようになる。

apacheであれば、virtualhostに、php-fpmであれば、www.confに設定できる。

 

このように実行タイムアウト、いわゆるexecution timeoutをちゃんと処理していないことで、

痛い目を見る可能性があるので、このあたりはチェックしておくといざというときに大きな障害を回避できる。

 

以上

投稿日時:2018年03月15日 23:33   カテゴリー:mysql, php   [コメントがあればどうぞ]

前回も書いたが、

maxsclaleとphpのmysqlndでまた問題があったので、

記載しておく。

 

たぶんまた、


PDO::setAttribute( ATTR_EMULATE_PREPARES, false )

のせいなのだろうが。。

 

その1 maxscaleのコネクションプールが使えなくなる

nativeのエミュレートを有効にした状態で、

maxscaleのコネクションプールを使うと以下のようなエラーが頻発する。


Wrong COM_STMT_PREPARE response size. Received 7 with query:

これは、mysqlnd側が出力しているエラーなのだが、

どうもレスポンス(応答)のサイズが期待したものと異なるからのようある。

 

その2 高負荷でreadwriteが使えなくなる

maxscaleのreadwrite splitを使っている状態で、

高負荷になると以下のエラーが頻発する。


SQLSTATE[HY000]: General error: 2003 Lost connection to backend server. with query:

どうも、slaveを見失ってしまうことが多く、結果として、

master側への接続もエラーになるというもの。

 

使っていたバージョンは、

maxscale2.0.4なのであるが、

意外に高負荷に現状耐えることが出来てないのかな、、と思う。

とはいえ、すぐにbugfixされるので、継続的に見守っていきたい。

 

投稿日時:2017年03月21日 22:28   カテゴリー:mariadb, mysql, php   [コメントがあればどうぞ]

phpのmysqlndというライブラリは素晴らしいものである。

しかし、その機能に悩まされたので、記載しておく。

 

そもそもmysqlndは、

  1. ネイティブのprepared statementのサポート
  2. DBの型に合わせたphpの自動型変換サポート
  3. フェイルオーバ検知の仕組みの提供(mysqlnd_ms)

などの機能がある。

 

1と2については、


PDO::setAttribute( ATTR_EMULATE_PREPARES, false )

により実現できる。

しかし、3については、これを設定すると機能しなくなる(らしい、未検証)。

 

さらに上記を設定した場合、

raw_queryでさえも、prepared statementとして扱われてしまう。

一見問題なさそうなのですが、

maxsacleのreadwrite splitをかましていると、

prepared statementがmasterに振られてしまうため、

slave参照が行われなくなってしまう。

じゃあ、mysqlnd_msでやればいいじゃんって話だが、

先ほど書いたように機能しなくなってしまう(らしい、未検証)。

 

というちょっと困る事象。。

maxslaceがprepared statemtでもslaveに振ってくれればいいのだが。。

投稿日時:2017年03月14日 23:15   カテゴリー:mariadb, mysql, php   [コメントがあればどうぞ]

ローカル環境にS3環境を構築できる「S3 ninja」なるものを入れてみたので、

備忘録を残しておく。

 

  • ダウンロード

http://s3ninja.net/

上記からzipファイルを落として解凍すればよい。

 

  • 初期設定

解凍した直下に、「instance.conf.sdsignore」というファイルがあるので、

これを「instance.conf」とする。

また、dataフォルダがあるので、

その下に「s3」フォルダを作成する。

 

  • 起動

以下を実行すれば、「http://localhost:9444」でアクセス可能となる。

$ ./sirius.sh start

 

phpとjavaからアップしたが、本物とは違ったので、

コードを記載しておく。

なお、前提として、「http://localhost:9444」にアクセスして、

事前に「test」というバケットを作り、「public」にしておくものとする。

 

phpコード

<?php
require_once("aws.phar");
$bucketName = "s3";
$accessKey = "AKIAIOSFODNN7EXAMPLE";
$secretKey = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY";
$keyName = "test/php/000.text";

$s3 = new Aws\S3\S3Client(array(
    'credentials' => array(
        'key'    => $accessKey,
        'secret' => $secretKey,
    ),
    'version' => "2006-03-01",
    'region' => "us-east-1",
    'endpoint' => "http://localhost:9444/",
));

$r = $s3->putObject(array(
   'Bucket' => $bucketName,
   'Key' => $keyName,
   'Body' => fopen("test.txt", "r"),
   'ACL' => 'public-read',
   'CacheControl' => 'no-store, no-cache',
));
var_dump($r);

 

javaコード

package sample.ninja_test;

import java.io.File;

import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.S3ClientOptions;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.PutObjectRequest;

public class App
{
  private static final String keyName = "java/000.text";
  private static final String bucketName = "test";
  private static final String accessKey = "AKIAIOSFODNN7EXAMPLE";
  private static final String secretKey = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY";

  public static void main(String[] args) {
    AmazonS3Client client = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey));
    client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));
    client.setEndpoint("http://localhost:9444/s3");

    PutObjectRequest putObj = new PutObjectRequest(bucketName, keyName, new File("test.txt"));
    putObj.setCannedAcl(CannedAccessControlList.PublicRead);
    client.putObject(putObj);

    String url = client.getResourceUrl(bucketName, keyName);
    System.out.println(url);
  }
}

期待した設定としては、javaのコードが正しい。
phpのコードはちょっと設定がおかしい。

とはいえ、この辺は、プログラムの設定等で吸収できるので、
簡易的なテストツールとしてはいいかもしれません。

投稿日時:2016年02月22日 16:58   カテゴリー:aws, java, php   [コメントがあればどうぞ]

remiレポジトリにおいて、

php7対応のモジュールが結構出揃いましたね。

現時点で、以下が引っかかった。

 

$ yum search php70 --enablerepo=remi | grep -F "php70" | awk '{print $1;}'
php70-php-pecl-propro-devel.x86_64
php70-php-pecl-raphf-devel.x86_64
php70-php-pecl-xmldiff-devel.x86_64
php70-php-pecl-yaconf-devel.x86_64
php70-php-yaconf-devel.x86_64
php70-runtime.x86_64
php70-scldevel.x86_64
php70.x86_64
php70-build.x86_64
php70-php.x86_64
php70-php-ast.x86_64
php70-php-bcmath.x86_64
php70-php-cli.x86_64
php70-php-common.x86_64
php70-php-dba.x86_64
php70-php-dbg.x86_64
php70-php-devel.x86_64
php70-php-embedded.x86_64
php70-php-enchant.x86_64
php70-php-fpm.x86_64
php70-php-gd.x86_64
php70-php-gmp.x86_64
php70-php-horde-horde-lz4.x86_64
php70-php-imap.x86_64
php70-php-interbase.x86_64
php70-php-intl.x86_64
php70-php-json.x86_64
php70-php-ldap.x86_64
php70-php-litespeed.x86_64
php70-php-mbstring.x86_64
php70-php-mcrypt.x86_64
php70-php-mysqlnd.x86_64
php70-php-oci8.x86_64
php70-php-odbc.x86_64
php70-php-opcache.x86_64
php70-php-pdo.x86_64
php70-php-pdo-dblib.x86_64
php70-php-pear.noarch
php70-php-pecl-amqp.x86_64
php70-php-pecl-apcu.x86_64
php70-php-pecl-apcu-bc.x86_64
php70-php-pecl-apcu-devel.x86_64
php70-php-pecl-apfd.x86_64
php70-php-pecl-apm.x86_64
php70-php-pecl-crypto.x86_64
php70-php-pecl-eio.x86_64
php70-php-pecl-env.x86_64
php70-php-pecl-ev.x86_64
php70-php-pecl-gender.x86_64
php70-php-pecl-geoip.x86_64
php70-php-pecl-geospatial.x86_64
php70-php-pecl-gmagick.x86_64
php70-php-pecl-hdr-histogram.x86_64
php70-php-pecl-hprose.x86_64
php70-php-pecl-hrtime.x86_64
php70-php-pecl-http.x86_64
php70-php-pecl-http-devel.x86_64
php70-php-pecl-imagick.x86_64
php70-php-pecl-imagick-devel.x86_64
php70-php-pecl-json-post.x86_64
php70-php-pecl-libsodium.x86_64
php70-php-pecl-lzf.x86_64
php70-php-pecl-mailparse.x86_64
php70-php-pecl-memcache.x86_64
php70-php-pecl-memcached.x86_64
php70-php-pecl-mogilefs.x86_64
php70-php-pecl-mongodb.x86_64
php70-php-pecl-msgpack.x86_64
php70-php-pecl-msgpack-devel.x86_64
php70-php-pecl-mysql.x86_64
php70-php-pecl-oauth.x86_64
php70-php-pecl-pcs.x86_64
php70-php-pecl-pcs-devel.x86_64
php70-php-pecl-pq.x86_64
php70-php-pecl-propro.x86_64
php70-php-pecl-raphf.x86_64
php70-php-pecl-redis.x86_64
php70-php-pecl-rrd.x86_64
php70-php-pecl-seaslog.x86_64
php70-php-pecl-selinux.x86_64
php70-php-pecl-ssdeep.x86_64
php70-php-pecl-stats.x86_64
php70-php-pecl-swoole.x86_64
php70-php-pecl-taint.x86_64
php70-php-pecl-termbox.x86_64
php70-php-pecl-trader.x86_64
php70-php-pecl-translit.x86_64
php70-php-pecl-uploadprogress.x86_64
php70-php-pecl-uuid.x86_64
php70-php-pecl-varnish.x86_64
php70-php-pecl-weakref.x86_64
php70-php-pecl-xattr.x86_64
php70-php-pecl-xdebug.x86_64
php70-php-pecl-xmldiff.x86_64
php70-php-pecl-xxtea.x86_64
php70-php-pecl-yac.x86_64
php70-php-pecl-yaconf.x86_64
php70-php-pecl-yaf.x86_64
php70-php-pecl-yaml.x86_64
php70-php-pecl-yar.x86_64
php70-php-pecl-zip.x86_64
php70-php-pgsql.x86_64
php70-php-process.x86_64
php70-php-pspell.x86_64
php70-php-recode.x86_64
php70-php-smbclient.x86_64
php70-php-snmp.x86_64
php70-php-soap.x86_64
php70-php-tidy.x86_64
php70-php-xml.x86_64
php70-php-xmlrpc.x86_64
php70-php-yaconf.x86_64

 

centos7のbaseに入ってくるのは数年後だろうけど。。

remiを使えるのであれば、これだけあれば結構いける気がする。

 

投稿日時:2016年02月10日 09:26   カテゴリー:php   [コメントがあればどうぞ]

phpにも、pythonやrubyと同じようにインタラクティブシェルがあるんですね。。

最近知りました。。。

 

php -a

 

とやるみたい。。

 

投稿日時:2015年07月14日 13:13   カテゴリー:php   [コメントがあればどうぞ]

6月12日にphp7-alphaがリリースされていた。

予定では、11月に正式版になるとのこと。

 

言語の書き方という面において、

個人的には、

  • 関数の戻り値型の指定
  • スカラー型によるタイプヒンティング

の導入は良いかなと思う。

 

たださ、なんかjavaにどんどん近づいているよね?

そのうち、javaのコレクションに相当するものが出てきそう。

 

httpdの組み合わせによる利用が一般的だから、

どんだけパフォーマンスでるんだろうね?

 

webサービスの場合、javaで書いたほうがよくね??

と個人的には思ってしまうよ。。

 

投稿日時:2015年06月25日 15:18   カテゴリー:php   [コメントがあればどうぞ]

windows8.1

cygwinでphpビルトインサーバを用いて、

phalconフレームワークを動かしてみた。

 

予めやっておくことは、

  • ビルドできる環境
  • phpおよび関連モジュールのインストール
  • phalconのインストール(linuxの方法でcygwinもできます)

です。

 

そして、

サンプルのinvoをダウンロードして、

公開ディレクトリに移動して、

php -S localhost:8000 routing.php

をたたけば起動する。

 

ここで、あらかじめ以下2点を対応しておく。

①invoのapp/config/config.iniのbaseUriを「/」に変更しておく

②公開ディレクトリ直下にrouting.phpを作成する。

<?php
$route = parse_url(substr($_SERVER["REQUEST_URI"], 1))["path"];

if (is_file($route)) {
    if(substr($route, -4) == ".php"){
        require $route;         // Include requested script files
        exit;
    }
    return false;               // Serve file as is
} else {                        // Fallback to index.php
    $_GET["_url"] = "/" . $route;        // Try to emulate the behaviour of your htaccess here, if needed
    require "index.php";
}

 

で、おしまい。

 

routing.phpについては、phpの公式ページに書いてあるのを、

phalconようにちょろっと修正しただけです。

投稿日時:2015年06月16日 17:36   カテゴリー:php   [コメントがあればどうぞ]

新しいネタがないので、

過去の小ネタを。

 

phpでデーモンプログラムを組んで、

そこで、pdoを使う場合、

fetchを使うと処理が落ちる。

fetchAllでないとダメ。

 

理由は、、、忘れた。。

投稿日時:2015年06月16日 09:37   カテゴリー:php   [コメントがあればどうぞ]