2012-01-24

存在はもちろん知っていたものの、あまり使ったことのなかったdefine。
ある案件で各種設定がいろいろと必要なものがあったので、
defineで定数を設定した別ファイルを作成し、
それをプログラム側にてインクルードするような作りにしました。

これがなかなか便利で、設定ファイルもコメントをしっかり入れておけば、
あまりプログラムに詳しくない人でも問題なくないよう変更ができますし、
JavascriptでCSSを変更するようにすれば、
背景や文字のカラーなどを変更しやすくするようにもできます。

あと、複数の定数があったときに、定数の名前を変数でループできるのか、
調べてみると見事にやり方が載っていました。

PHP defineによる定数の名前を変数で指定する
http://shoyu-ramen23.jugem.jp/?eid=208

for ($i=1; $i<=$cnt; $i++) {
 //定数の名前を組み立てる
 $teisu = 'G_BANNER_' . $i;

 //定数の名前が定義されていたら定数の値を出力する
 if (defined($teisu)) {
  echo constant($teisu) . '<br />';
 }
}


今後もdefineをうまく使っていこうと思います。

2012-01-17

デバッグ的な意味で、配列の中身を参照したいなと思い、
print_r関数を使おうとしたのですが、エラーになってしまいました。

print_r関数の前でもちょっと構文的にあやしいかもというプログラムを書いていたので、
そっちをあれこれ直してみたり、、といろいろ苦労していたのですが、
print_rに単純に()を使っていなかったという初歩的なミスが発覚。。

echoやprint関数は()を省略しても問題なく動くのですが、
print_r関数は()を抜いてはいけないそうです。
勉強になりましたぁ。

2011-11-21

数字の桁区切りのnumber_format関数の逆バージョン、
カンマを取り除く関数があるかな?と思った調べてみたのですが、
そういう関数は特にないようです。

単純にstr_replace関数でカンマを何もなしに変換させる、
というやり方になります。

$num = str_replace(‘,’,”,$data);

2011-08-11

ある配列の中に同じ値が入っているケースがあるか、
あるのであれば、同じ値が入っている回数はいくつなのか、、
そういうことが関数でお手軽にできないものかなーと調べたら、
さすがPHP、ちゃーんと便利な関数が用意されていました。

array array_count_values(array $input)

配列inputの中に同じ値を持つ場合、それを連想配列として返します。

例)
$data = array("abc", "cde", "abc", "bcd", "def");
$result = array_count_values($data);
print $result['abc'];


出力結果は 3 になります。

2010-11-04

自分が制作したあるシステムで、こちらが想定していたものより
はるかに多い件数のデータを処理することがありました。

まずアップロードするファイルサイズが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分ほどかかりました。

2010-07-12

スピーバーというところで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です。

2010-06-28

よくチェックしている「PHPSPOT開発日誌」というサイトに
なかなか便利そうなPHPライブラリが紹介されていたので、メモしておこうと思います。

http://phpspot.org/blog/archives/2010/06/phpkses.html

ある特定のタグを例外に、他のタグを取り除く場合には、PHPはstrip_tagsという関数があるのですが、
このライブラリは属性まで指定することが可能なようです。

2010-06-07

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

2010-05-28

PHPのエラーは表示させないほうがよいとされていますが、
テスト環境では表示できないとわかりづらいですね。

htaccessを使えば、特定のディレクトリだけエラーを表示・非表示することができます。

◆表示
php_flag display_errors On

◆非表示
php_flag display_errors Off

2010-04-16

サイトのヘッダー、メニューといった共通部分を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;
?>