PHPであるが、「ソースコードパクってきていじって使う」程度しかしたことがない。
しかし、Flexをクライアントにした際のサーバーサイドにPHPを使わざるを得ない状態なので使っていたのだが・・・。
リリース環境は Windows OS で SQL Server を使える業者のホスティングサービスを利用することになった。
で、テスト環境から移したらいろいろとトラブルが・・・。
まず、PHPの問題ではないが、SQL Server Management Studio を使ってサーバーのDBに接続するのだが、契約先の仕事場からやると全くつながらない。その会社のファイヤーウォールで接続を許可していないためだ。やむなくこれは自宅から。
さて、本題のPHPでのハマリどころ。ホスティングサービスの契約ではサーバーのPHP.iniを触ったりはできないし、ドライバをインストールしたりもできない。というか、そもそもそんなところにアクセスできないのだ。
で、開発環境は好き放題いじっていたので、その設定関係で・・。
[SQL Server にアクセスできない]
なんか反応ないな、と思っていたら SQL Server Native Client がインストールされていないのか、ドライバがない、というエラーが出ていた。開発環境はPHP 5.4.3に対し、本番環境は 5.2.xである。
何か手はないか調べたが、odbc_から始まる命令ではなく、mssql_から始まる命令が使えるそうだ。PHP 5.3 以降では WindowsのPHPからは外されたらしい・・。
こいつに書き換えて、なんとかアクセスはできるようになった。
[SQL Server の文字が化ける]
SQL Server 更新前と取得後に mb_convert_encoding命令でエンコードをしていた。が、全然ダメ。いろいろなサイトを見ていると
・mssql_の関数はShiftJISでしか返さない
・接続時にエンコードを指定すると直るらしい。が、mssql_の関数にそんなパラメータはない
・漢字の値の前にNをつける( hoge = N'ほげ' って感じ)でいける
など・・。一時的に「exeを叩いて、そちらからさせるか」と検討し、実際に作り始めたものの、Delphiではちょっぴり挫折。CoCreateion?がどうたらってのが・・。
しかし、解決の糸口は意外なところにあった。mb_convert_encoding のパラメータにmb_http_output() という引数を使っていたのだが、「決まり文句のおまじない」だと思っていた。しかし、気になって調べると「そこの環境で指定されているものを使う」そうだ。
phpinfo()で確認すると、開発環境は UTF-8に対し、本番環境は pass となっていた。よってmb_http_output() を 'UTF-8' に書き換えてやったらうまくいった。
[サーバーからの返却文字列が欠ける]
サーバーからの返却文字はJSON形式を使っている。FlexでJSONの解釈はラクだからだ。JSONはPHP内ではなくSQL Server のビューで編集してPHPからスルーパス。しかし、この文字が途中で欠ける。調べると255文字くらいまでは返っていた。
phpでそんな設定はないらしく途方に暮れそうになったが、vharcharだと255で切れるらしいとのこと。これも開発環境では問題なかったのでPHPのバージョンによるのだろう。
SQL Server のビューで、JSONにしている部分をcastしてTEXTにすれば解決した。
TEXT型はいずれSQL Serverでサポートされなくなるものらしい。で、nvarchar(max)はどうか、というと、これだとだめらしい。ntextもだめ。TEXTでやるしかなさそうだ・・。
知っていれば瞬殺なんだろうけれど、2つめの解決までに10時間ほど、最後の一つは結構早く解決したのだが、トラブルにしてやられた感じだ。勉強にはなったが、結構疲れた・・・。
しかし、Flexをクライアントにした際のサーバーサイドにPHPを使わざるを得ない状態なので使っていたのだが・・・。
リリース環境は Windows OS で SQL Server を使える業者のホスティングサービスを利用することになった。
で、テスト環境から移したらいろいろとトラブルが・・・。
まず、PHPの問題ではないが、SQL Server Management Studio を使ってサーバーのDBに接続するのだが、契約先の仕事場からやると全くつながらない。その会社のファイヤーウォールで接続を許可していないためだ。やむなくこれは自宅から。
さて、本題のPHPでのハマリどころ。ホスティングサービスの契約ではサーバーのPHP.iniを触ったりはできないし、ドライバをインストールしたりもできない。というか、そもそもそんなところにアクセスできないのだ。
で、開発環境は好き放題いじっていたので、その設定関係で・・。
[SQL Server にアクセスできない]
なんか反応ないな、と思っていたら SQL Server Native Client がインストールされていないのか、ドライバがない、というエラーが出ていた。開発環境はPHP 5.4.3に対し、本番環境は 5.2.xである。
何か手はないか調べたが、odbc_から始まる命令ではなく、mssql_から始まる命令が使えるそうだ。PHP 5.3 以降では WindowsのPHPからは外されたらしい・・。
こいつに書き換えて、なんとかアクセスはできるようになった。
[SQL Server の文字が化ける]
SQL Server 更新前と取得後に mb_convert_encoding命令でエンコードをしていた。が、全然ダメ。いろいろなサイトを見ていると
・mssql_の関数はShiftJISでしか返さない
・接続時にエンコードを指定すると直るらしい。が、mssql_の関数にそんなパラメータはない
・漢字の値の前にNをつける( hoge = N'ほげ' って感じ)でいける
など・・。一時的に「exeを叩いて、そちらからさせるか」と検討し、実際に作り始めたものの、Delphiではちょっぴり挫折。CoCreateion?がどうたらってのが・・。
しかし、解決の糸口は意外なところにあった。mb_convert_encoding のパラメータにmb_http_output() という引数を使っていたのだが、「決まり文句のおまじない」だと思っていた。しかし、気になって調べると「そこの環境で指定されているものを使う」そうだ。
phpinfo()で確認すると、開発環境は UTF-8に対し、本番環境は pass となっていた。よってmb_http_output() を 'UTF-8' に書き換えてやったらうまくいった。
[サーバーからの返却文字列が欠ける]
サーバーからの返却文字はJSON形式を使っている。FlexでJSONの解釈はラクだからだ。JSONはPHP内ではなくSQL Server のビューで編集してPHPからスルーパス。しかし、この文字が途中で欠ける。調べると255文字くらいまでは返っていた。
phpでそんな設定はないらしく途方に暮れそうになったが、vharcharだと255で切れるらしいとのこと。これも開発環境では問題なかったのでPHPのバージョンによるのだろう。
SQL Server のビューで、JSONにしている部分をcastしてTEXTにすれば解決した。
TEXT型はいずれSQL Serverでサポートされなくなるものらしい。で、nvarchar(max)はどうか、というと、これだとだめらしい。ntextもだめ。TEXTでやるしかなさそうだ・・。
知っていれば瞬殺なんだろうけれど、2つめの解決までに10時間ほど、最後の一つは結構早く解決したのだが、トラブルにしてやられた感じだ。勉強にはなったが、結構疲れた・・・。