ある配列の中に同じ値が入っているケースがあるか、
あるのであれば、同じ値が入っている回数はいくつなのか、、
そういうことが関数でお手軽にできないものかなーと調べたら、
さすがPHP、ちゃーんと便利な関数が用意されていました。
array array_count_values(array $input)
配列inputの中に同じ値を持つ場合、それを連想配列として返します。
例)
$data = array("abc", "cde", "abc", "bcd", "def");
$result = array_count_values($data);
print $result['abc'];
出力結果は 3 になります。
自分が制作したあるシステムで、こちらが想定していたものより
はるかに多い件数のデータを処理することがありました。
まずアップロードするファイルサイズが2Mを超えていたことと、
ループ処理に時間がかかりすぎて、PHPが強制終了してしまっていたので、
htaccessにて下記の設定を入れました。
php_value max_execution_time 120
php_value memory_limit 5M
php_value post_max_size 6M
php_value upload_max_filesize 5M
max_execution_time が1つのスクリプトでPHPが強制終了するまでの時間(秒)です。
デフォルトは30だったのを120としました。
memory_limit はメモリ使用量の制限値、
post_max_size はPOST およびファイルのアップロードで許可される最大サイズ、
upload_max_filesize はァイルのアップロードで許可される最大サイズです。
上記の設定で、4M超のCSVデータ(2万件強)をアップロードして、
データベースに流し込むのに30分ほどかかりました。
スピーバーというところでVPSでサーバーを借りるクライアントの案件があり、
PHPプログラムであるデータのファイル書き出しをしようと思ったところ、
通常のHTMLファイルを入れているhttpdocsの上の階層のディレクトリに書き出すことができませんでした。
「open_basedir restriction in effect」というエラーが出ていたので、
設定がらみの問題だろうなというのはわかっていたので、検索をかけてみました。
[参考サイト1]
http://blog.look-ss.jp/article.php/20071225140335935
ここの書き方がとてもわかりやすかったので、試してみたのですが、状況は変わらず。。
phpinfoで確認してみたところ、open_basedirの内容が変わっていませんでした。
さらに検索をかけてみたところ、下記のサイトは少しvhost.confの書き方が違ったので、
こちらで試してみました。
[参考サイト2]
http://kaiketsu-bookmark.seesaa.net/article/111677677.html
こちらの設定にすると、phpinfoの内容が書き変わっていました!
そしてもちろんPHPでのファイル書き出しも成功しました!!
というわけで、スピーバーでの成功例は、
(logdirというディレクトリを事前に作っておくとします)
/var/www/vhosts/ドメイン名/conf/vhost.conf を
<Directory /var/www/vhosts/ドメイン名/httpdocs>
php_admin_value open_basedir "/var/www/vhosts/ドメイン名/httpdocs:/var/www/vhosts/ドメイン名/logdir"
</Directory>
と変更(もしくはファイル作成)し、コマンドプロンプトにて、
# /usr/local/psa/admin/sbin/websrvmng --reconfigure-vhost --vhost-name=ドメイン名
念のため構文エラーがないか確認して
# /etc/init.d/httpd configtest
Apacheを再起動!
# /etc/init.d/httpd restart
でバッチリでした!
※2010-12-10追記
SSL環境にて同じことをする場合には、/var/www/vhosts/ドメイン名/conf/vhost_ssl.conf を
同じやり方で変更します。
その後のコマンドも上記と同じやり方でOKです。
よくチェックしている「PHPSPOT開発日誌」というサイトに
なかなか便利そうなPHPライブラリが紹介されていたので、メモしておこうと思います。
http://phpspot.org/blog/archives/2010/06/phpkses.html
ある特定のタグを例外に、他のタグを取り除く場合には、PHPはstrip_tagsという関数があるのですが、
このライブラリは属性まで指定することが可能なようです。
FLASHはセキュリティの関係で外部ドメインの画像ファイルを読み込んで表示はできないと思っていたのですが、
裏ワザ的にできるやり方がありました。
間にPHPファイルをはさむことで実現させます。
◆RSSファイルなどの場合
1)下記の内容のurl.phpファイルを作成
<?php readfile( $_REQUEST["url"] ); ?>
2)パラメータを指定して読み込み
http://www.aroun-d.com/url.php?url=http://www.cocorowest.com/rss/
◆画像ファイルの場合
1)下記の内容のimage.phpファイルを作成
<?php
header( “Content-type: image/jpeg” );
readfile( $_REQUEST["url"] );
?>
2)パラメータを指定して読み込み
http://www.aroun-d.com/image.php?url=http://www.cocorowest.com/001.jpg
参考サイト
http://www.dango-itimi.com/blog/archives/2005/000693.html
PHPのエラーは表示させないほうがよいとされていますが、
テスト環境では表示できないとわかりづらいですね。
htaccessを使えば、特定のディレクトリだけエラーを表示・非表示することができます。
◆表示
php_flag display_errors On
◆非表示
php_flag display_errors Off
サイトのヘッダー、メニューといった共通部分をPHPでインクルードさせる場合などで、
特にPHPのプログラムを書かない場合は、HTMLファイルを外部ファイルにして、
読み込ませて表示するのが楽だったりします。
単純にファイルを読み込んで出力するのであれば、readfile 関数を使えば
ファイルの中身を読み込んで出力します。
エラー表示しないようにするには先頭に@をつけておきます。
<?php
@readfile('sample.html')
?>
一部分を外部ファイルから読み込んだりする場合は、
file_get_contents 関数が便利。
<?php
$menu_html = "aaaa\n";
$menu_html .= @file_get_contents("sample.html");
$menu_html. = "bbbbbb\n";
echo $menu_html;
?>
ある月の末日というのは、2月を除けば30日か31日、2月だけ閏年の処理があって、と
やろうと思えば大したことはないのですが、もちろん楽にできるに越したことはありません。
date関数の”t”を使うと、当月の末日を簡単に取得できます。
date("Y-m-t");
当月ではなく年月を指定したい場合はこちら。
$lastday = date("Y-m-t", strtotime(”2010-04-01”));
”t”って何の略だろう。。
PHPでディレクトリを作るというのは過去にもやっていたと思うのですが、
すっかり忘れてしまっていたので、メモです。
// ディレクトリを作る場所
$img_dir = "/home/aaaaa/public_html/images/";
// 作成するディレクトリ名
$new_dir = "thumb";
// ディレクトリが存在するかチェックし、なければ作成
if(!is_dir($img_dir)){
umask(0);
$rc = mkdir($new_dir, 0777);
}
PHPでRSSファイルを読み込んで、最新情報を表示するような処理を行うとき、
RSSの持っている日付書式を、普通のYYYY-MM-DDに変換するやり方です。
RSS2.0の日付(pubDate)
<pubDate>Tue, 23 Feb 2010 20:32:18 +0900</pubDate>
※2010/09/09加筆
strtotimeを使用する場合は、タイムゾーンを設定する必要があるようです。
またPHPのバージョンによってバグもあるようなのでご注意ください。
<?php
$rssDate = "Tue, 23 Feb 2010 20:32:18 +0900";
$myDate = strtotime($rssDate);
echo date('Y-m-d H:i:s', $myDate);
?><?php
$rssDate = "Tue, 23 Feb 2010 20:32:18 +0900";
date_default_timezone_set('Asia/Tokyo');
$myDate = strtotime($rssDate);
echo date('Y-m-d H:i:s', $myDate);
?>