MW211 EXIT

devlog
PHP/便利な関数いろいろ
2013年07月06日
変数一覧
print_r(array_keys(get_defined_vars()));

定数一覧
print_r(get_defined_constants(true));

関数一覧
print_r(get_defined_functions());

クラス一覧
print_r(get_declared_classes());
分類:PHP
PHP/大容量POSTの制限
2013年06月15日
「php.ini」で制限をかける項目としては以下があるが、
以下のような性格の違いがある。
┌───────┬────────────┬─────────────────┐
│max_input_vars│POSTパラメータ数の上限  │上限数までは送信される            │
├───────┼────────────┼─────────────────┤
│post_max_size │POSTサイズの上限        │全て送信されない                  │
└───────┴────────────┴─────────────────┘
分類:PHP
PHP/自らのURLを取得する方法
2013年05月19日
┌──────────────────────────────────────┐
│if ((isset($_SERVER['HTTPS']))                                              │
│ && ($_SERVER['HTTPS'] == 'on'))                                            │
│{                                                                           │
│    $protocol = 'https://';                                                 │
│} else {                                                                    │
│    $protocol = 'http://';                                                  │
│}                                                                           │
│$url = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];         │
└──────────────────────────────────────┘
もしくは
┌──────────────────────────────────────┐
│$protocol = (@$_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';          │
│$url = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];         │
└──────────────────────────────────────┘
分類:PHP
PHP/ドキュメントルート
2013年05月18日
「$_SERVER['DOCUMENT_ROOT']」にて、Apacheの設定ファイル「httpd.conf」中に
定義しているドキュメントルートが取得できる。
┌──────────────────────────────────────┐
│DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs" │
└──────────────────────────────────────┘

ドキュメントルート直下に以下のソースコードを記述したファイルを定義して
これをアサインすれば、ドキュメントルートの代替にできる。
┌──────────────────────────────────────┐
│define('DOCUMENT_ROOT2', str_replace('\\', '/', dirname(__FILE__)));        │
└──────────────────────────────────────┘
ま、こいつのいいところは、ドキュメントルート以外でも使えるということだ。

ドキュメントルート配下のサブドキュメントルート的なところに置けば、
サブの中でドキュメントルートっぽく使えるようになる。
分類:PHP
PHP/ファイルの排他制御
2013年02月22日
まず、「flock()」の第二引数は以下の三つ。
・「LOCK_SH」…共有ロック
・「LOCK_EX」…排他ロック
・「LOCK_UN」…アンロック
#Windows版は対象外の「LOCK_NB」については端折ります。

つまり、先日言ってた「funlock()」的なものは
「flock(■,LOCK_UN)」ということになる。

次に話は変わって、ファイルにデータを書き込むタイミング。
「fwrite()」ではなく「fclose()」なんですよこれが。
「fwrite()」は仮のバッファに溜め込むようなもんで、
「fclose()」で初めて日の目を見るわけです。

なので、以下のようにした場合、排他区間は②~④となり、
④~⑤が非排他区間となってしまう。
┌──────────────────────────────────────┐
│$fp = fopen('ouput.txt','w');  …①                                         │
│flock($fp, LOCK_EX);           …②排他                                     │
│fwrite($fp, '出力');           …③排他                                     │
│flock($fp, LOCK_UN);           …④排他                                     │
│fclose($fp);                   …⑤←重要                                   │
└──────────────────────────────────────┘
⑤が終わって初めて遠足、いや排他を終えなきゃならないのに、フライングとなる。

つーことで、「fclose()」でアンロックも兼ねてくれるなら、
自発的にアンロックしちゃダメってのが一昔前の常識だったわけです。
#「fclose()」の中のロック解除の順番はファイル出力の後なんだよねという
  疑問があるかもしれませんが、その辺はちゃんと考慮してくれてるみたいです。
┌──────────────────────────────────────┐
│$fp = fopen('ouput.txt','w');                                               │
│flock($fp, LOCK_EX);                                                        │
│fwrite($fp, '出力');                                                        │
│fclose($fp);                                                                │
└──────────────────────────────────────┘

し・か・し、PHP5.3.2で仕様変更が発生して「fclose()」が
アンロックをやってくれなくなった。
#この原因は、どうやらバグ対応みたい(ファイルを二重に開いた場合とからしい)
  とにかく、クローズに徹して余計なことはしないってことかな

じゃ、どうする?
仕様変更を見なかったことにする?(ロックが解除されません)
手動でアンロックする?(排他が保証されません)

う~ん、身動きがとれない。。。

で、解決策。「fclose()」がやってくれている重要なファイル出力作業を
「fflush()」で先にやっちゃえばいいらしい。
┌──────────────────────────────────────┐
│$fp = fopen('ouput.txt','w');  …①                                         │
│flock($fp, LOCK_EX);           …②排他                                     │
│fwrite($fp, '出力');           …③排他                                     │
│fflush($fp);                       ←重要                                   │
│flock($fp, LOCK_UN);           …④排他                                     │
│fclose($fp);                   …⑤                                         │
└──────────────────────────────────────┘
これなら、排他は保証されるし、排他も解除できる。
分類:PHP
PHP/file関数の排他制御
2013年02月21日
「file()」や「file_get_contents()」では排他制御ができない。

排他制御には「flock()」が必要で、この引数の一つがファイルポインタで、
つまりは、ファイルポインタがないと排他制御ができないのだが、
「file()」や「file_get_contents()」はファイルポインタがない
(敢えて意識しないような作りの)関数だからだ。

ま、読み込む分には、リトライとか必要ないからそれでいいのかもしれないが、
書き込みとセットで「読み込み~書き込み」の間を独占したい場合には、
排他制御が必要となってくる。

ということで、実現方法としては、ダミーの排他用ファイルを用意して、
そちらで排他の真似事のようなこと(といっても思いっきり排他だけど)をする。

  (1) 排他用ファイルをロックする
  (2) 「file()」とかを使って読み込む
  (3) 「fopen()」「fwrite()」「fclose()」を組み合わせて書き込む
  (4) 排他用ファイルをアンロックする

これにより、(1)~(4)の区間が排他占有となり、(2)と(3)も排他占有となるという寸法。
┌──────────────────────────────────────┐
│$fp = fopen('lock.txt','w');                                                │
│flock($fp, LOCK_EX);                                                        │
├──────────────────────────────────────┤
│fclose($fp);                                                                │
└──────────────────────────────────────┘
「flock()」の対義語的な「funlock()」(そんなのないけど)は、
「fclose()」が内包してくれてる感じかな。

追記:と思ったら、PHP5.3.2以降ではアンロックを
      「fclose()」が内包してくれない仕様になってしまった
…というわけで続く。。。
分類:PHP
PHP/foreach()とexplode()とNULLと
2013年02月03日
「foreach()」で回す配列がNULLだったらNG。「foreach (NULL as $value)」

では、「explode()」を経由するんだけど、元ネタがNULLだった場合は?
┌──────────────────────────────────────┐
│foreach ((explode(',', NULL)) as $value) {                                  │
│}                                                                           │
└──────────────────────────────────────┘
こいつはOK。

「var_dump()」で「explode(',', NULL)」を探ってみると…。
┌──────────────────────────────────────┐
│array(1) { [0]=> string(0) "" }                                             │
└──────────────────────────────────────┘
ダミーの配列を作って(空文字を入れて)くれるみたいだ。
分類:PHP
PHP/セキュリティ対策
2012年11月12日
ぶっちゃけ、セキュリティ対策って以下のことですよね?

【クロスサイトスクリプティング(XSS)対策】
  以下の五つの文字を、画面表示時に以下に置換して表示する
  ・「'」→「'」
  ・「"」→「"」
  ・「&」→「&」
  ・「<」→「&lt;」
  ・「>」→「&gt;」

【SQLインジェクション対策】
  以下の三つの文字を、SQL実行時に以下に置換して実行する
  ・「'」→「\'」
  ・「"」→「\"」
  ・「\」→「\\」
  もしくは、以下の一つの文字を、SQL実行時に以下に置換して実行する
  ・「'」→「''」
  #この場合は、残りの二つは機能的にSQLインジェクションを防止できていること
分類:PHP
PHP/mb_strcut()の端数は切り上げられます
2012年11月11日
mb_strcut()のパラメータにマイナス値を指定してあげると、
右から抜き出すことが可能だが、端数が出た場合には端数も切り上げて抽出してしまう。
よって、指定したサイズよりも+1取得される場合がありうる。

mb_strcut(,-4)の場合
  あいうえお   →  いうえお
  あいうえおA  →  いうえおA

┌──────────────────────────────────────┐
│$抽出 = mb_strcut($文字, -4);                                               │
│if (mb_strwidth($抽出) > 4) {                                               │
│    $出力先 = '...' . mb_strcut($抽出, -3);                                 │
│} else {                                                                    │
│    $出力先 = '..' . $抽出;                                                 │
│}                                                                           │
└──────────────────────────────────────┘

ちなみに、左から普通に切り出した時も同じです。
mb_strcut(,0,4)の場合
  あいうえお   →  あいうえ
  Aあいうえお  →  Aあいうえ
分類:PHP
PHP/日付チェックと日付変換
2012年09月04日
年月日をチェックしてくれる便利な関数「checkdate()」と、
チェックした後の日付をタイムスタンプに変換してくれる便利な関数「mktime()」。

二人の連携は見事にとれている…と思ったけど。
「mktime()」は2038年以降NGなのにも関わらず「checkdate()」はOKを出す。
「checkdate()」は32767年までOKなのだ。

う~ん。
分類:PHP
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 … 18 次へ