mcryptの突然死

Fatal error: Call to undefined function mcrypt_module_open() in /Library/WebServer/Documents/***/***.php on line *

突然、mcryptが動かなくなりました。
いろいろ試してみたものの、結局phpをインストールし直したら元の通り動きました。

参考:
macphpをアップデート
http://kimikimi714.hatenablog.com/entry/2013/07/06/233518

Macで一番簡単にPHP5.4をインストールする方法
http://www.1x1.jp/blog/2012/05/php_54_for_mac_os_x_as_binary_package.html

$ curl -s http://php-osx.liip.ch/install.sh | bash -s 5.5
$ export PATH=/usr/local/php5/bin:$PATH

ログファイル取得(2)

前回のコードにちょっと手を加えました。
名前が"log_YYYY-MM-DD.csv"の形式の場合のみ正規表現にて受け付けるように変更。
それと、そのファイル名より年月日をYYYYMMDDの形式で抽出し、ファイル名配列のキーとして使用。

<?php
	// 参考サイト: http://codaholic.org/?p=685 アクセス日 2013/11/01
	$dir = './log/'; // ディレクトリ文字列取得
	$dh = opendir($dir); // ディレクトリを開く
	$fnArray = array(); // ファイル名配列初期化
	while (($fn = readdir($dh)) !== FALSE){ // ディレクトリからエントリ(ファイル名またはディレクトリ名)が読み込める限り
		if(!is_dir($dir . $fn) && preg_match('/^log_[0-9]{4,4}-[0-9]{2,2}-[0-9]{2,2}\.csv/', $fn) === 1){ // 取得した名前がディレクトリでなく、かつ名前が"log_YYYY-MM-DD.csv"の形式の場合
			$fnKey = str_replace("-", "", substr($fn, 4, 10)); // ファイル名から年月日を抽出した文字列をキーとする
			$fnArray[$fnKey] = $fn; // ファイル名配列に追記
		}
	}
	closedir($dh); // ディレクトリを閉じる
	arsort($fnArray); // ログは古い順になっているので、これを新しい順に並び替え
?>

logディレクトリにlog_2013-11-02.csv、log_2013-11-03.csv、log_2013-11-04.csvを置いた状態。
できた配列$fnArrayの内容は以下の通りになります。

Array
(
	[20131104] => log_2013-11-04.csv
	[20131103] => log_2013-11-03.csv
	[20131102] => log_2013-11-02.csv
)

ログファイル取得

ログファイルは"log_2013_11_01.txt"といった具合に、"log_"で始まる仕様。
とりあえず一覧を取得して配列に入れてみるテスト。
参考サイト: http://codaholic.org/?p=685 アクセス日 2013/11/01

<?php
		$dir = './log/';
		$dh = opendir($dir);
		
		$fnArray = array();
		while(false !== ($fn = readdir($dh))){
			if(!is_dir($dir.$fn) && strpos($fn, "log_") === 0){
				array_push($fnArray, $fn);
			}
		}
		closedir($dh);
?>

振り分け

バイスによって振り分けるための関数。
参考サイトはコード中に。
戻り値: 0 PC、1 携帯、2 スマートフォン、3 タブレット

<?php
	function sortByDevice($ua) {
		// 参考: http://www.ore-memo.com/808.html アクセス日: 2013/10/25
		// 参考: http://monolio.com/memo/php/user-agent-page-change/ アクセス日: 2013/10/25
		$deviceType = 0; // 初期値
		if(strpos($ua, "DoCoMo") !== FALSE || strpos($ua, "J-PHONE") !== FALSE || strpos($ua, "Vodafone") !== FALSE || strpos($ua, "SoftBank") !== FALSE || strpos($ua, "UP.Browser") !== FALSE || strpos($ua, "KDDI") !== FALSE || strpos($ua, "WILLCOM") !== FALSE || strpos($ua, "PDXGW") !== FALSE || strpos($ua, "DDIPOCKET") !== FALSE) {
				$deviceType = 1; // 携帯
		} else if (strpos($ua, "Android") !== FALSE) {
				if (strpos($ua, "Mobile") !== FALSE) {
					$deviceType = 2; // スマートフォン
				} else {
					$deviceType = 3; // タブレット
				}
		} else if (strpos($ua, "iPhone") !== FALSE) {
			$deviceType = 2; 
		} else if (strpos($ua, "iPad") !== FALSE) {
			$deviceType = 3;
		}
		return $deviceType;
	}
?>

クッキーを使わずにセッションを継続する

とりあえず以下のサイトが参考になりそうなので研究中。

http://www.yc.tcu.ac.jp/~yamada/doc/php/0802.html


とりあえず作ってみた結果:

if (SID !== "") { // セッションID定数が空でない場合=クッキーが無効の場合
	print "<input type=\"hidden\" name=\"s\" value=\"" . session_id() ."\">\n"; // セッションIDをhiddenとして埋め込む
} 

ちなみにファイルの最初でsession_name("s");としてあります。

ローカルでは動くのにサーバーに上げたら動かないと思ったら、サーバーのsession.use_only_cookiesが1になっていました。

iPhone 5で見たらだいぶ縮小されて見えるサイト、次の方法でとりあえず解決。

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" >

参考:iPhone用にサイトの幅と画面の幅を合わせるには
http://iphone.f-tools.net/html5/Width-Smart-Phone.html