Home > レンタルサーバー

レンタルサーバー Archive

MySQLの接続タイムアウト設定

「PHPスクリプトから接続タイムアウトを設定する方法」のメモ

【はじめに】
最近、商品カタログをWebで表示するプログラムを作成し納品した。
お客様に商品登録をされてる状況ですが、7/7(火)朝に画面が表示されない、遅いという問題があるとの連絡あり。

調査すると、いつもではないが、htmlは比較的すぐに読まれるが(遅い時は遅いけど)、PHPスクリプトは無茶苦茶遅かったり、応答がない。
ただ、そうでないこともあり、要は安定していない。

Windows系のレンタルサーバーでプログラムを動かしているのだが、何が原因だろう。

動作環境のデータをダウンロードして開発環境(CentOS)や他社Linux系レンタルサーバーでテストしてみたが、何もストレスを感じることなく使える。
(さらっと1行で書きましたが、ファイルのダウンロード・アップロード、データベースのエクスポート・インポートをやってます。
問題のサーバーが安定しないので、ftpは遅い、途中で切れるため、時間はかかってます^^;この仕事も評価してくれるお客様だったら苦労は報われます)


導入した当初は普通に動いていたことを考えると、レンタルサーバー側に原因があるような気がする。
とはいうものの、原因がわかるまであえて断言しないようにします(苦笑)。

【対応開始】
とりあえず、遅い現象が発生した時に、何が原因なのかを調べるため、スクリプトを書いてみました。
主に調べたことは以下の2点です。(他にもやっていますが、集約するとこんなもんです)
(1)スクリプトは本当に実行されているのか(time()関数の値を記録し表示)
(2)DBにMySQLを使っているが、接続で待たされているのではないか。

結論は、
(1)スクリプトの実行開始までに30秒とか40秒とか待たされる、また実行されないことがある。
実行されると1秒以内にはプログラムは終了している。一度だけ50秒かかったことがあるが、再現しない。
(2)MySQLとの接続は問題なさそう。

htmlファイルは比較的早くGETできるので、プログラム実行の問題と思われます。サポートに調査をお願いすると、
レンタルサーバーに障害が起こっているとの回答あり。先に見ておけばよかった^^;。

障害報告ページを見ると7/6正午頃から障害発生と書かれている。
しかし、サービス名だけなので、契約しているサーバーなのかどうかわからないよぉ(苦笑)

まだ復旧していないようだが、レンタルサーバー側の対応を待つことにする。

【では本題に入ります】

前置きが長くなりました^^;。

今回のテストプログラム作成でMySQLの接続タイムアウト設定についても調べたが、すぐにわからなかった。
当初、mysql_connect()の引数か何かで設定できるのかと思ったのだが、該当するものがない。
ネットで調べてみるとphp.iniの設定変更でいけることが判明。

後述するコードで確かに変更できていました。
複数台のMySQLサーバーの中から生きているサーバーに接続するなんてことができそうですね。
(実際にタイムアウトしているかどうかは未検証です)

【設定コード】

<?php
    $key = "mysql.connect_timeout";
    $new_sec = 10;
    echo "local value:".ini_get( $key )."<BR>";
    ini_set( $key, new_sec );
    echo "new value:".ini_get( $key )."<BR>";
/*
== result ==
local value:60
new value:10
*/

?>


【謝辞】
掲載しているソースコードは
ソースコード HTML化 コンバーター「唐辛子」
を利用してBlog用のhtmlを生成し、貼り付けています。いつも、ありがとうございます。

  • Comments (Close): 0
  • Trackbacks (Close): 0

PHPスクリプトからImageMagickを使う

前回の記事で、PHPでGDライブラリを使ってサムネイル作成に失敗する話を書いた。
PHPでサムネイル作成に失敗する

メモリー不足が原因なので、heteml(ヘテムル)共用サーバーを使っている限りどうしようもない。

heteml(ヘテムル)では、ImageMagickが使える、という情報を得て、PHPからImageMagickのコマンドconvertを呼び出して使ってみた。
結果はばっちり。これで大きな写真(画像)の縮小も容易にできる。ひとまず、サーバーサイドで片付いたのでよかった。

サムネイル(縮小)画像生成に使ったパラメータと、指定領域の切り取り処理のパラメータ、両方のコマンドライン文字列をメモしておく。

【サムネイル作成】
$width = 600;
$height = 600;
$src_file = “input.jpg”;
$dis_file = “output.jpg”;
$cmd = “/usr/bin/convert -thumbnail {$width}x{$height} ‘$src_file’ ‘$dis_file'”;

【指定領域切り取り】(画像左上から600×600ピクセルの領域を切り取り)
オフセットの指定において符号(+/-)は必須なので注意してほしい。
$src_w = 600;
$src_h = 600;
$offset_x = “+0”;
$offset_y = “+0”;
$src_file = “input.jpg”;
$dis_file = “output.jpg”;
$cmd = “/usr/bin/convert -crop {$src_w}x{$src_h}{$offset_x}{$offset_y} ‘$src_file’ ‘$dis_file'”;

(*)JPEGの品質を指定したい場合は、ファイル名の前あたりにでも、「-quality 品質値」を追加して、
$cmd = “/usr/bin/convert -crop {$src_w}x{$src_h}{$offset_x}{$offset_y} -quality 85 ‘$src_file’ ‘$dis_file'”;
などと記述する。サムネイル作成も同じコマンドで指定できる。

インストール先に応じてconvertコマンドのパス名は変更して欲しい。CentOSも上記のパス名だった。
コマンドの起動にはexec()関数を使えばよいだろう。こんな感じ。

$output_arr = array();
$return_value = “”;
exec( $cmd, $output_arr, $return_value );

出力文字列と、実行結果(整数値)はそれぞれ$output_arrと$return_valueに入っているので、
処理結果に応じて対処すること。

ImageMagickのconvertコマンドを久しぶりに使ったが、今回は随分と楽に感じた。
数年前に初めて使った時はImageMagick使うのにコマンド名は何でImageMagickでないのか
疑問に思ったりした。機能を提供するコマンドが複数あるだけで、ImageMagickは総称と思っているが、さて、どうなんでしょう。
しかし、今は日本語の本が何冊も出てるんですね。以前は見つけられなかったような気がするのですが。

今回、参考にしたURLは以下の通り。

【参考文献】(英文)
http://www.imagemagick.org/script/command-line-options.php

  • Comments (Close): 0
  • Trackbacks (Close): 0

PHPでサムネイル作成に失敗する

会社のWebサイトをヘテムル(heteml)というレンタルサーバーで公開している。
このヘテムルは共用サーバーでPHPを使ったWebサービスの試作にも使っている。

専用サーバーと違って共用サーバーはメモリー容量、利用できるプログラムなど制限が課せられていて、Webサービスを動かそうとすると思わぬトラップもある。

先週末から写真(画像)を使ったWebアプリケーションの試作をしている。
hetemlではファイルのアップロードサイズが5MBという制限があるが、php.iniをコントロールパネルで変更できる。
とりあえずこの制限はクリアできた。ただ、最大サイズは50MBなので制限はある。
hetemlでupload_max_filesizeを変更

昨日から運用でこのくらいが上限かなと思う容量10MBでテストしているが、アップロードは問題なさそうだ。
しかし、アップロードした写真(画像)のサムネイル(縮小)画像をレンタルサーバー側で作成する部分で問題がある。
メモリー不足が原因でサムネイル(縮小)画像の作成に失敗するのだ。

よく調べてみると、
ImageCreateFromPNG()やImageCreateFromJPEG()の部分で、
メモリーにロードする時に致命的エラーが発生している。この後に
ImageCopyResampled()
を呼んでサムネイルを生成するのだが、メモリーが少ない環境ではこの手法は使えない。

しかし、いったいどのくらいメモリーは使えるのだろうか。
共用サーバーのメモリを調べてみると50MBだったが、実際に使えるメモリー容量は小さいようだ。
処理できた画像サイズから推定すると16MB程度が最大のようだ。(画像を読み込んだ実験による推定)

ちなみに、必要な容量はファイルサイズではなく、画像をビットマップ展開した時の容量である。
[width] x [height] x [1ピクセルあたりのバイト数](JPEGだと3,透過PNGだと4)である。

1000万画素クラスのカメラ、例えば幅3840ピクセル x 高さ2880ピクセルだと、
3840 * 2880 * 3 = 33177600(31.64MB)
軽く16MBを越えている。

PHPのモジュールを使う限り、このメモリー制限からは逃れられない。策はいくつかあるが、
外部コマンドを使う方法を調べたところ、どうやらImageMagickが使えるようだ。
次回、ImageMagickを使った結果を掲載したい。

【次の記事】
PHPスクリプトからImageMagickを使う

  • Comments (Close): 0
  • Trackbacks (Close): 0

ホーム > レンタルサーバー

メタ情報

Return to page top