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

WindowsXPに自動的にログオンする方法

Windowsの電源を入れるとログオン画面で待っている状態でなく、ログオンも完了して、すぐに使える状態までWindowsの状態を進める方法のメモ。

意図しない人に使われる危険性がある場合は、自動化はおすすめしない。
自宅や特定の人しか使わない環境で自動化したい場面で使ってほしい。
なお、本情報によって何か損害があったとしても私にはどうすることもできない。

Googleで適当なキーワードで検索するといろいろ発見できるので、興味のある方にはチャレンジしていただくとして、私が探した結果で、役に立ったURLを掲載しておく。

URL先の情報がいつ無くなるとも限らないので、私が試した内容も書いておく。
Microsoftの技術者向け情報のURLも以前大きく変わってしまいアクセスできなくなったことがあるので、安心できない。
まあ、本ブログのURLも含めどこの情報も同じだと思う。いつまでも同じ場所にあると思わない方がよい。

記載の情報はすべてWindowsXP Professionalでの例。

【Microsoftの情報】

  1. [スタート] から、[ファイルを指定して実行] をクリックし、control userpasswords2 と入力します。
  2. [ユーザーがこのコンピュータを使うには、ユーザー名とパスワードの入力が必要] チェック ボックスをオフにします。
  3. [適用] をクリックします。
  4. 自動ログオン時に利用するユーザー名とパスワードを入力し、[OK] をクリックします。
  5. 再度 [OK] をクリックすれば終わりです。

これで十分操作できるのだが、画面キャプチャーの結果も入れてメモを作ってみた。
画像が4点入っただけだが、1時間くらいかかってしまった。時間よ戻ってこ~い。

【私の試した内容に基づく情報】

  1. [スタート]メニュー から、[ファイルを指定して実行(R)] をクリック



  2. 「ファイル名を指定して実行」のウィンドウが開く
    「control userpasswords2」と入力し、「OK」をクリック



  3. 「ユーザーアカウント」のウィンドウが開く。
    「ユーザーがこのコンピュータを使うには、ユーザー名とパスワードの入力が必要(E)」の チェックボックスをオフにする。
    「適用(A)」をクリック



  4. 「自動ログオン」のウィンドウが開く
    「ユーザー名(U)」に自動ログオン用のユーザー名を
    「パスワード(P)」にパスワードを入力し、「OK」をクリック



  5. 「ユーザーアカウント」のウィンドウに戻るので、再度「OK」をクリック

これでパソコンを再起動すれば自動的にログオンできるようになる。

Vistaも同様の方法でいけそうだが、微妙に画面構成が異なるようだ。
難しくはないと思うので、想像力を働かせてチャレンジしてほしい。

今回私が使った時間がこれからの多くの人の時間の無駄を節約できれば幸いだ。

【ちょっとしたこと】
Windowsではなぜか、「ログオン」「ログオフ」という表現を使う。「オン」と「オフ」のペアだ。
Linuxでは「ログイン」「ログアウト」という表現。「イン」と「アウト」のペアだ。
両者になぜそんな相違があるのかは知らない。

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

NotifyIconコンポーネントに表示される文字列

.NET Framework 2.0では、NotifyIconクラスを使ってWindowsタスクバーの通知領域にアイコンを表示できる。
使いやすくクラス化されているのでとってもカンタンに利用できる。

Webアクセスログを定期的にダウンロードするソフトで、常駐中にタスクバーに表示させるのに使っている。
起動時にTextプロパティにアプリケーション名を入れて初期化するのだが、たま~に初期化されないことがある。
ちなみに、そのTextプロパティは、アイコン上にマウスカーソルを近づけた時に表示される。

再現性が極めて低いこと、プログラムの機能に実害がないため、これまで詳しい調査はしていない。

話は変わって、この件との直接の関係はないのだが(役に立たない情報ですみません)
調べて物をしていてひょっとして気になる情報を見つけたのでメモしておく。

この情報によると、「シェルへの登録作業が 4 秒以内に完了しない場合には失敗したとみなして制御を戻します」とある。
そもそもアイコンが登録されないので、前述の不具合との関係は薄いと思うが・・・
多発するようであれば、API関係も参考にしようと思う。
一体、.NetFrameworkは内部的に何を呼んでるんだろう。

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

ホーム > 備忘録

メタ情報

Return to page top