忍者ブログ

カウンター

プロモーション

カレンダー

02 2024/03 04
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

AntinomyMy の実験室

   私のWEBアプリ実験室です!

ブログ内検索

楽天でお買い物

twitter

最新トラックバック

最新コメント

忍者アナライズ

ウェザーニュース

バーコード

本を買う

アクセス解析

Google+

[PR]

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


No Image

Apache とPHP のバージョンについて(2014年3月31日)

Apache と PHP の調べ物

メモで始めたブログ、
しかし案外あれこれ見に来て下さるみたいで、
古くなると間違った内容になっちゃうから
直さなくてはいけなくなるんだね!?

まぁ、一応追加修正しておきます^^;

Apache とPHP の関係で、
PHP のどのコンパイラで使われたバージョンを使えば良いか?
という話を過去ブログで書いて着ましたが、
これを書き直すという事です。

PHP のNon Thread Safe とThread Safe の違い

PHP はどうもコンパイラのVer でWebサーバを決めている?!

やっとわかった!PHPのバージョンの謎!(PHP5.3.2とか)


これらの事ですが、
2014年3月31日、今日現在、少し違うと言う事です。

厳密には、
Apache のバージョンに2.4 が出てきたので、
それに伴い、Windows 版のPHP は、
Apache 2.4系を使う場合には、
VC9(VC11)でコンパイルされた物を使ってと記述が変わっていました。

なので、PHP のコンパイラのバージョンを選ぶ時、
Apahce 1と、Apache 2 、Apache 2.2 はVC6 系統でよかったと思いますが、
Apache 2.4 はVC6やVC11 でコンパイルされた物を使うと書かれています。

PHP5.4 とかは、もうApache 2.2 用とか、
つまりVC6 でコンパイラされたのは配布されてない気配???
パッと見でアーカイブで古いPHP の配布を見た所、

      Tuesday, March 22, 2011  3:04 PM      5097231 php-debug-pack-5.3.5-nts-Win32-VC6-x86.zip
Tuesday, March 22, 2011 3:04 PM 5272229 php-debug-pack-5.3.5-Win32-VC6-x86.zip
がWindows で最後のVC6コンパイルな様に見えました。


これ以後はVC9 になって、そのうちVC11 の文字が・・・

古いApache は、
何処か(見てないけど)にもうサポートしないと書いてあったりするのかもしれません。

自分でコンパイル出来る様にして古いApache に対応するしかなく、
というか、何処かのレンタルサーバー(ホスティングサービス)も、
古いPHP やApache は新規に選べなくなるのだろうから、
やはりそのうちは乗り換えが必要なのでないのかな????とか思ってます@x@;

嫌だな・・・
とか思いつつ、新しいのにも興味があるけれど、
今現在ホスティングサービスでの安定版とされているのが
5.3.x くらいなので、うーん、これ何時移行しよう????

フレームワークのSymfony2 とか、
少し前だと新しい物使いすぎて、
要件を満たさないホスティングサービスとか
いっぱいあったけど、
そろそろ変わってくるんじゃないかな???

さてさてさて、
うれしいのか悲しいのか分からない波がまた
知らず知らずに押し寄せてきた!?


追加修正のつもりだったけど、
まとめではないので、
また気が向いたらこれまでの
まとめ一覧でも載せる(ほんと?w)かも。



お粗末な修正でしたorz

拍手[3回]

PR

No Image

PHP GD ライブラリ で、Apache TypesConfig の落とし穴

Apache と PHP の調べ物

 さぁ、今回は3日で通算8時間ほどハマったPHP の GD ライブラリ を使おうとした時の
事柄を書いて置こう。

 結果から言うと、ブラウザが識別できるヘッダー情報を付加して送るPHPの関数である
header 関数は、header 関数でMIME を設定しただけではブラウザ 側がしっかり認識できない
と言うことです。

 すぐに対象方法が知りたい場合はかなり読み飛ばして<対処方法>を読めば早いです。

 またそれ以前にPHP のGD ライブラリで画像を吐き出させようとheader 関数を呼ぶと
その時点でheader が既に呼び出されてエラーを出してしまう場合は、
php.ini の設定でアウトプットのバッファー設定がオフだと何かPHP関連のファイルを
ブラウザに出力する記述があった場合に即座にheader をPHP が吐き出してしまう様です。

 なのでoutput_buffering = off

に成っているのならば、

output_buffering = 4096

などに変更しましょう、それでなければほとんど、header 関数自体が使えないと
思った方が良いかもしれません。

 header 関数でMIME を設定しただけではブラウザ 側がしっかり認識できない方の理由はどうも、
ブラウザが直接ヘッダーを確認する前に、どうもWebサーバ が間に入り、
その情報を操作してしまっているみたいです。

 私の場合はXAMPP などは使わず、WAMP 環境を個別にインストールと設定を行い、
環境を整えてきました。
 もしかすると私が使ったことが無いXAMPP などを使っている人は、
設定がもうされていたりして困らない事なのかもしれないですが、そこは未確認です。


--- 知ってたら飛ばしていい所 ---
 ま、でも知らない人にまずGD ライブラリ とは何か?
と言うと、PHP スクリプトを用いて文字や図形をWBMP やGIF 、PNG、JPEG などの画像情報を
作り、それをWeb サーバ上の溶媒に保存したり、Webサーバ に保存しないでメモリ上にある
画像情報 と、ブラウザ がどんな情報か解釈できるヘッダー情報 を追加して、
それをApache などのWebサーバ を通してブラウザに送り、
ブラウザ側に表示できるという一風変わった、しかし優れた物である。

多分、よく使われていると思われる場面というのは、
新規にフリーメールなどや何処かの会員に登録する時に、
不正にアカウントを取得されない様に画像に数字や文字が書かれ、
それを誤り無く入力しなければいけない場面で使われていると思う。

 それでは簡単な例を載せようと思いましたが、
基本的にGD ライブラリのImage 関数の例にある事柄をしようとすると
それが出来ないので、その例はそのImage 関数のマニュアルに書いてあるので、
割愛し、重要なheader 関数の事柄だけを書いてみます。


imagegif 関数の場合
   header('Content-Type: image/gif');

imagepng 関数の場合
  header('Content-Type: image/png');

imagejpeg 関数の場合
  header('Content-Type: image/jpeg');

ここで定義しているのでブラウザ側はこれで動く様に思える、
しかし実は
Apache でMIME のタイプが指定されていなければ、ブラウザで判断出来ない様だ。

それが分かったのは、レンタルサーバに上げると自身の書いたPHPスクリプトは動く、
phpinfo 関数を使ってWindows 環境とLinux 環境の違いはあれ、ほぼ一緒にしているのに
サーバに上げた方は正常に画像がブラウザで表示されるのに、ローカル側では
ブラウザで表示されない、そこで気がついたのだった。

<対処方法>
 ここで重要な対象方法ですが、とても簡単です。
Apache の設定ファイルにPHP で自分で使いたいMIME タイプを
「httpd.conf」の中にAddType でMIME を個別に指定するか
それとも、実はApache を普通にインストールすると付随している
設定ファイル(mime.types)を読み込む記述をすると、
MIME タイプの設定が完了します。(勿論Apache は再起動しなければいけません)

このどちらかの方法でMIME タイプを読み込めると言うことです。

もし、「mime.types」のファイルを使わないならば、
の方法のApache の設定ファイルの「httpd.conf」の中に

AddType image/jpeg .jpeg .jpg .jpe

と書けばいいのです。

設定ファイル「mime.types」は、中の定義で基本的なMIME タイプの設定がかなりの量が成されています、
これを基本ベースとして足らないMIME の付け加えや修正を行えば便利だと思います。

の「mime.types」を読み込む設定を「httpd.conf」の中に書くには、

TypesConfig conf/mime.types

と1行書くだけです。
これだけの事が分かるまでに私はPHPの挙動の方を疑って結構悩みました。

さて、「mime.types」のファイルで例えば
JPG ですが、どの様に定義されているかを見ると、

image/jpeg     jpeg jpg jpe

と書いてありました。

このどちらかを書けば、情報は送信されていてサイズもあるのに表示されないという
悩ましい事態から抜け出すことが出来ると思います。

最後に注意点というか論点ですが、「mime.types」のファイルを用いる場合に、
自身が使いたいヘッダー情報があるかどうかを確認した方が良いかもしれません。
使いたいMIME タイプが定義してあるかどうかの設定なのですから。

- - - - - -
追伸:
もしもPNGファイルの画像を出力するスクリプトをPHPで書くならば、
そのスクリプトの保存形式をUTF-8の場合は必ずBOM無しにしなければいけません。

imagefttext imagettftext 関数で画像を使う場合、
保存形式をUTF-8(BOMあり)ではなくUTF-8(BOMなし)にして保存しなければ、
画像データの先頭まで、ファイル形式の構造情報が3バイト付加されてしまうので、
画像データとして用いることができなくなるので注意が必要です。
れこは関数が画像をファイルとして出力する機能が衝突するからでしょうか?
不可思議な仕様ですが、PHPの画像生成関数は現在BOMに依存している様です

UTF-16だと2バイトのBOMが付き、それは意味があるそうですが、
UTF-8でのBOMは実際には無意味なものらしいです。
詳しくは、BOM をどうぞ。


長い個人的なメモなのか説明なのか毎回分かりませんが、以上ですw

拍手[1回]


No Image

zend_extension と zend_extension_ts そしてApache の設定・・でもよくわからない

Apache と PHP の調べ物

過去の私のブログ、xdebug やらZend Debugger を使う前の予備調べ にある
XDebug というデバッガーを動かすためのphp.ini の設定でずっと疑問に思っていた設定がある。

その設定項目は、
zend_extension
zend_extension_ts
の違いであった。

この違いの意味が何処に書いてあるのか今までわからなかった。

しかし公式サイトにしっかり書いてあったのでその事をメモしておく。

公式サイトには、
以下の4つが存在した。

--- --- php.ini に書くらしい、xdebug の設定(※なにやら環境によって違うので鵜呑みは危険!)  --- ---
zend_extension
string

動的読み込み可能な Zend 拡張モジュール (たとえば APD) を PHP の起動時に読み込む際の絶対パス。

zend_extension_debug string

zend_extension の亜種で、デバッグ情報つきでコンパイルされた拡張モジュール用のもの。

zend_extension_debug_ts string

zend_extension の亜種で、デバッグ情報つきかつスレッドセーフでコンパイルされた拡張モジュール用のもの。

zend_extension_ts string

zend_extension の亜種で、スレッドセーフでコンパイルされた拡張モジュール用のもの。
 --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

デバッグ情報付きというのは、PHPをデバッグする為のものらしく、
PHPがデバッグ情報付きでコンパイルされているかどうかによって _debug とついた読み込みを
するかしないかを選ばなくては正確に動作しない様だ。

その情報を知るには、phpinfo関数を用い、その項目から、
 

Debug Build no
でデバッグでコンパイルされているかどうか調べ、
no でないならばデバッグなので _debug がついている物を使う。
(※よく考えたらコンパイルしたら変わることは無いと思われる)

そいて、 _ts についてもphpinfo関数を用い、その項目から、
Thread Safety enabled
でスレッドセーフが有効ものかどうか調がついている物を使う。
enabled ならば _ts が付いている物を使う。

Debug Build と Thread Safety によるextension 表(※多分間違っています!)
  Debug Build
 no  noじゃない(Yesとかon?)
Thread Safety
 
disabled  zend_extension  zend_extension_debug
enabled  zend_extension_ts  zend_extension_debug_ts

色々調べてみるとこんな感じになるのかと思った。

追加情報: ---------------------------
が!!!!!
これは間違えかもしれない!!!!
このページの下の方にありますが、phpinfo()のステータスでThread Safety はどうも
Apache との連携の事を指し示し、xdebug との連携の意味では無いのかもしれません。

そしてDebug Build もデバッグした時に決まってしまうのでしょうから、
後から変わることは多分ないでしょう。
--------------------------------


まず、ここまでの参考サイト:
Xdebug によるデバッグ環境の構築 - Web/DB プログラミング徹底解説

xdebug追加をphp.iniに記述するとき、
zend_extension=か zend_extension_ts=なのかを見極めるには。
: PHPの種 ブログ



なにか私のWindows 環境では、php.ini にxdebug の設定をすると説明どおりの設定では動かない件
 そしてココからが問題だ!
私の場合は、phpinfo()で調べると、
Debug Build no
Thread Safety enabled
であったので、その場合は、zend_extension_ts で良いと思ったのだが動かない!
不思議な事にThread Safety が無効(disabled) の
zend_extension でないと動かないのである。
このThread Safety の意味はなんなんだろうか?

追加情報: ---------------------------
 もう一度よく考えてみた。
現時点でWindows版のPHP のphpinfo関数 による
Thread Safety がenabled である表記はApache に対してのスレッドセーフの事を示していて、
xdebug の為の表記ではないと思われる。

 確認の為にあえてNo-Thread-Safe の
5.3 VC6 Non-thread-safe (32 bit) を使ってzend_extension_ts はもちろん、
zend_extension の設定を使ってみましたが、xdebug のがphpinfo関数でステータス一覧は
出てこなかったので、なぜか動かない状況でした。

もし何か良い情報があれば、気軽にコメントもらえると助かります。

私の動いてる環境は「zend_extension = の書式」 + 5.3 VC6 (32 bit) (Tread Safe) のDLL で
動作確認が取れています。

xdebug公式 ダウンロード:download/SVN
--------------------------------

一応スレッドセーフの関連はApache の動作をスレッドを用いる設定でも出てきた記憶があるので
こちらもどう動いているかなどの
参考URL
@IT:Apache 2.0の必須設定と基本セキュリティ対策(1/3)
 

             xdebug

xdebug support enabled
Version 2.1.0

Supported protocols Revision
DBGp - Common DeBuGger Protocol $Revision: 1.145 $
                                ・
                                ・
                          (各設定の値も続く)

ステータスでは上記のこんな感じの項目が現れたらステップ実行や、変数の値を知るなど
デバッグ機能が使える様になる。


尚、この文章は後ほど修正しているので、順番的におかしく読みにくい部分があるかもしれませんがご了承下さい^^;

拍手[0回]


No Image

PHP のNon Thread Safe とThread Safe の違い

Apache と PHP の調べ物

Non Thread Safe とThread Safe の違いについて書きます。

 これはNon Thread Safe とThread Safe の違いって何か?なんですが、
簡単に言うとCPUの中で同時に動いている別々の処理機構であるスレッドが、
1つの動作中のプログラムを効率よく処理しようとしたときに不具合を起こさない様に作られたものを
「Thread Safe」といい、1つのプログラムが同時にCPU内のスレッドを使う事に対応していないのが
「Non Thread Safe」と言う事になる様です。

 では厳密にPHP にはその2種類の「Non Thread Safe」と「Thread Safe」が
存在しているのですが、しかし私には、これらの違い指し示す所が厳密にどうなのか、
私には見当が付きませんでした。

 なのでファイルを比較したところ、見当が付きました。
------------------------------------------------------------------
[1] : php-5.3.2-nts-Win32-VC6-x86|| [2] : php-5.3.2-Win32-VC6-x86           
------------------------------------------------------------------
 |..                         ---| |..                          ---

L|dev                        ---|R|dev                         ---

L|ext                        ---|R|ext                         ---

 |extras                     ---| |extras                      ---

 |PEAR                       ---| |PEAR                        ---

 |go-pear.bat                 90| |go-pear.bat                  90

 |icudt36.dll         10,166,272| |icudt36.dll          10,166,272

 |icuin36.dll            954,368| |icuin36.dll             954,368

 |icuio36.dll             53,248| |icuio36.dll              53,248

 |icule36.dll            192,512| |icule36.dll             192,512

 |iculx36.dll             45,056| |iculx36.dll              45,056

 |icutu36.dll            106,496| |icutu36.dll             106,496

 |icuuc36.dll          1,064,960| |icuuc36.dll           1,064,960

 |install.txt             86,472| |install.txt              86,472

 |libeay32.dll         1,069,056| |libeay32.dll          1,069,056

 |libpq.dll              464,172| |libpq.dll               464,172

 |license.txt              3,286| |license.txt               3,286

 |news.txt               279,571| |news.txt                279,571

 |phar.phar.bat               39| |phar.phar.bat                39

L|pharcommand.phar        53,212|R|pharcommand.phar         53,212

L|php-cgi.exe             45,124|R|php-cgi.exe              49,223

L|php-win.exe             28,740|R|php-win.exe              28,743

L|php.exe                 28,736|R|php.exe                  28,739

 |php.gif                  2,523| |php.gif                   2,523

 |php.ini-development     70,515| |php.ini-development      70,515

 |php.ini-production      70,800| |php.ini-production       70,800

L|php5.dll             5,476,417| |                             

L|php5apache.dll          32,839|R|php5apache.dll           36,938

 |                              |R|php5apache2.dll          36,939

 |                              |R|php5apache2_2.dll        36,941

 |                              |R|php5apache2_2_filter.dll 36,948

 |                              |R|php5apache2_filter.dll   36,946

L|php5apache_hooks.dll    49,229|R|php5apache_hooks.dll     53,328

L|php5embed.lib          785,796|R|php5embed.lib           796,892

 |                              |R|php5nsapi.dll            32,841

 |                              |R|php5ts.dll            5,648,454

 |pws-php5cgi.reg            135| |pws-php5cgi.reg             135

 |pws-php5isapi.reg          139| |pws-php5isapi.reg           139

 |readme-redist-bins.txt  20,693| |readme-redist-bins.txt   20,693

L|snapshot.txt               952|R|snapshot.txt                955

 |ssleay32.dll           212,992| |ssleay32.dll            212,992
------------------------------------------------------------------
[1] : php-5.3.2-nts-Win32-VC6-x86 の方が、「Non Thread Safe」であり、
[2] : php-5.3.2-Win32-VC6-x86 の方が、「Thread Safe」です。

 このファイル比較を見てわかったことは、Apache2系のdll が「Non Thread Safe」の方には
有りません。
 当たり前といえば当たり前なのかもしれませんが、Apache2系がマルチスレッドでの動作に
対応したApache だったはずなので、マルチスレッド対応=「Thread Safe」であり、
もっと言い換えるなら、「Thread Safe」=マルチスレッド対応=Apache2も対応 と言う意味で
とらえて、もっと名前の意味だけで種類を考えるのならば、PHP のバージョンの話ではあるが、
Non Thread Safe とThread Safe の違いは、Apache のバージョンの違いであることと
思っておけば良いと思う。

○「Thread Safe」=マルチスレッド対応=Apache2系も対応
○「Non Thread Safe」=マルチスレッド非対応=Apache1系のみ

 また前回ブログにも載せた
○IIS を使うならVC9 でコンパイルされたパッケージ
○Apache (2.2迄)を使うならVC6 でコンパイルされたパッケージ
を使う様にPHP のパッケージは構成されている。
(VCコンパイラのバージョンによってApache かIIS のどちらに使うかの
推奨?推薦?バージョンが決まっているっていた時代の話です。
今はもっとVC11 などもありますし、この記事を修正している今のPHPの最新バージョンは
7.2.2などがありますので、斜線をあえて引いておきました。)




ちょこっとリンク:
スレッドセーフの説明 



追伸:
上記の記事は古くなった!!!

追記の内容は
Apache とPHP のバージョンについて(2014年3月31日)
に書きました。

拍手[3回]


No Image

PHP5.3.2とApache2.2.15(気軽すぎた軽率なバージョン移行)

Apache と PHP の調べ物

 PHP5.3.0 からPHP5.3.2 へ
Apache2.1.11 からApache2.1.15 へ同時になにげなく移行しようと思ったのですが、
なぜかApache のhttpd ファイルにPHP の設定を4行書き込むとそのうち1行はなんとかエラーは
無いのですが、他の3行はまるで受け付けません。

 調べてみると、PHP5.3.2 にはPHP5.3.0 にあったファイルが無くなっていたり、
ちょっと不安要素もあります。

 これらの意味が判りました、コンパイラのバージョンによってWebサーバを決めている様なのです!!!
続き(後から書いたブログ) に詳細が載っています。


 またApache ですが、今まで何気なく使っていましたが、ダウンロード時点ですでに
OpenSSLを使えるmod_ssl が組み込まれた物と、そうでない物が存在している事も
知ってはいましたが、さほど気にしていませんでした。
 そしてPHPでは、Apache2 の MPM マルチスレッドモードを実運用環境で使用することは推奨されて
いなかったり
と色々ある様なので、結構奥が深いと思いました。

 PHP は特にですが、バージョンごとに内容が全く違いすぎて、その違いを簡単に調べるすべや、
経験や、情報収集の仕方が見つからないならば、下手にバージョンを変えるべきでは無い事も
個人的な考え方ですが身をもって理解しました。
 PHP は下位互換性の設定など勝手になんとかなると思って当てにしてはいけない! 
これが身をもって学んだ経験だと思います^^;


 とりあえず、PHPは5.3.0 に戻して、Apache だけをVerUpできるかやってみようと思います。
まず全部白紙に戻してみますw そんな感じでーw(どんな感じだろ?w)


追伸:このネタの落ち度は追求した結果わかりました。

 うん! これ(上の  で消した文章)も違ったね! ハマってる時に出した結論はある程度時間が
経つと変わったり、他の事に気が付いたり、他の情報が入り物事の見方が変わるもんですw
ってことで申し訳ないですが@@;

 まぁでも、このブログのタイトルに気軽すぎた軽率なバージョン移行 とありますが、
このPHP やApache と長く付き合っていく上で良い失敗、良い経験をしたと思っています。

多少ある(結構あるかも・・・w)続き(後から書いたブログ)をご覧下さいっw

拍手[0回]


  • Home
[PR]