[PHP]便利かもしれないコード

これまでに必要になったりして自分が作ったスニペットを載せておきます。横に書いてあるライセンスの下で自由に使ってください。

こっちの実装の方が効率的じゃん!とか動かないんだけど!っていうのがあればぜひ教えてください。


開発版のWordPressを使っているときに日本語訳を最新のものにする(Public Domain)

$sources[] = array("http://translate.wordpress.org/projects/wp/dev/ja/default/export-translations?format=mo", "ja.mo");
$sources[] = array("http://translate.wordpress.org/projects/wp/dev/admin/ja/default/export-translations?format=mo", "admin-ja.mo");
$sources[] = array("http://translate.wordpress.org/projects/wp/dev/admin/network/ja/default/export-translations?format=mo", "admin-network-ja.mo");
$sources[] = array("http://translate.wordpress.org/projects/wp/dev/cc/ja/default/export-translations?format=mo", "continents-cities-ja.mo");
foreach($sources as $source) {
    $a = file_get_contents($source[0]);
    file_put_contents("/{WordPressへのパス}/wp-content/languages/".$source[1], $a);
    unset($a);
}
  • {WordPressへのパス}は自分のWordPressのディレクトリまでのパスに置き換えてください。(/var/www/htmlとか)

モバイルからのアクセスかどうかを判定する(GPLv3)

WordPressのコードより改変

function is_mobile() {
 static $is_mobile;

 if ( isset($is_mobile) )
  return $is_mobile;

 if ( empty($_SERVER['HTTP_USER_AGENT']) ) {
  $is_mobile = false;
 } elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false
  || strpos($_SERVER['HTTP_USER_AGENT'], 'Android') !== false
  || strpos($_SERVER['HTTP_USER_AGENT'], 'Silk/') !== false
  || strpos($_SERVER['HTTP_USER_AGENT'], 'Kindle') !== false
  || strpos($_SERVER['HTTP_USER_AGENT'], 'BlackBerry') !== false
  || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== false
  || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mobi') !== false ) {
   $is_mobile = true;
 } else {
  $is_mobile = false;
 }

 return $is_mobile;
}
  1. $is_mobileをstatic変数として宣言し、同一ページ内で判定処理を二回以上行うことがないようにする。
  2. すでに$is_mobileがセットされている場合⇒その値を使用。
  3. UAが空の場合⇒非モバイル。
  4. UAに特定の語が含まれる場合⇒モバイル。
  5. その他の場合⇒非モバイル。

ファイルサイズを計算する(Public Domain)

function filesize_($filepath) {
    $filesize = 0;
    $si_units = array("", "k", "M", "G", "T", "P", "E", "Z", "Y");
    $i = 0;
    if(file_exists($filepath))
        $filesize = filesize($filepath);

    while($filesize >= 1024 && $i < count($si_units)) {
        $filesize = round($filesize / 1024, 2);
        $i++;
    }

    return $filesize . $si_units&#91;$i&#93; . "B";
}
&#91;/php&#93;
<ol>
	<li>ファイルサイズの初期値を0にする(ファイルが存在しないときのため)</li>
	<li>SI単位系の接頭辞一覧を定義する</li>
	<li>ファイルサイズを取得する</li>
	<li>ファイルサイズの値が1024以上でカウンタが接頭辞リストの要素数より少なければループに入る</li>
	<li>1024で割って、小数点以下二ケタに丸めて、カウントアップ。</li>
	<li>ループを抜けて、表示形式でのファイルサイズを返す。</li>
</ol>

<hr />

<h2>文字列からURLを探し出してリンクにする(Public Domain)</h2>

function url2link($value){
	return preg_replace(
		"/((http|https):\/\/(([A-Za-z1-9\-_]+\.)+[a-z]{2,3}([1-9a-z\-\/\._\?=&%\[\]]*)))/i",
		"<a href=\"\\1\" target=\"_blank\">\\1</a>",
		$value
	);
}

ファイルのダウンロードスピードを制限する(Public Domain)

Thanks to Jonas!

//ダウンロードさせたいファイルのパス
$filepath = '/path/to/your/file';

//ダウンロード速度(単位:kiB/s)
$dl_speed = 20.5;

if(file_exists($filepath) && is_file($filepath)) {

	//HTTPヘッダ情報
	//MIMEの判定
	$finfo = new finfo(FILEINFO_MIME);
	$mime = $finfo->buffer($filepath);
	//クライアントキャッシュの制御
	header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
	header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
	header('Pragma: no-cache');
	//MIMEの指定
	header('Content-Type: ' . $mime);
	//ファイルの最終変更日
	header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($filepath)).' GMT', true);
	//クライアントで保存される名前を指定
	header('Content-Disposition: attachment; filename="' . $filename . '"');
	//ファイルサイズを明示
	header('Content-Length: '.filesize($filepath));

	//とりあえずヘッダを送る
	flush();

	//ファイルストリームを開く
	$file = fopen($filepath, "r");	

	//ファイルポインタが終端でなければ
	while (!feof($file)) {
		//{$dl_speed}kiBだけ読み込む
		print fread($file, round($dl_speed * 1024));

		//クライアントに送る
		flush();

		//一秒間待機
		sleep(1);
	}

	//ファイルを閉じる
	fclose($file);
	exit;
} else {
	die('エラー:'.$local_file.'は存在しません!');
}

一番最後のコードはドイツにあるNetSlaveに勤務しているJonas Johnの提供してくれたコードですが、MIMEの判定ができておらず一部のブラウザで警告が発生する場合があったために判定機能を追加しました。
Jonasはほかにも様々なスニペットを公開しています。しばらく更新が止まっていますが、結構役に立ちますので一度目を通しておくことをお勧めします。

コメントを残す