APCのインストール

http://it.kndb.jp/entry/show/id/482 さんより


#phpizeとapxsのインストール
$yum install php-devel http-devel

#APCをDL→展開
#http://pecl.php.net/package/apc から最新を。
$ wget APCのファイル
$ tar -zxvf APCのDLしたファイル
$ cd APCの展開したディレクト
$ phpize
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20050922
Zend Extension Api No: 220051025

$ .configure --enable-apc
checking for egrep... grep -E
checking for a sed that does not truncate output... /bin/sed
  〜〜〜中略〜〜〜

checking whether stripping libraries is possible... yes
configure: creating ./config.status
config.status: creating config.h

$ make install
$ vi /usr/local/etc/php/extension.ini
/bin/sh /root/APC-3.0.15/libtool --mode=compile gcc -I. -I/root/APC-3.0.15 -DPHP_ATOM_INC -I/root/APC-3.0.15/include -I/root/APC-3.0.15/main -I/root/APC-3.0.15 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -DHAVE_CONFIG_H -g -O
 
        〜〜〜中略〜〜〜

See any operating system documentation about shared libraries for
more information, such as the ld[1] and ld.so[8] manual pages.

                                                                                                                                          • -

Installing shared extensions: /usr/lib/php/modules

#php.iniの最下行に設定追記
#viで最下行に行くには"Shift"+"g"
$vi /etc/php.ini


extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20060613/"
[apc]
extension=apc.so
apc.enabled=1
apc.optimization=1
apc.ttl=10
apc.gc_ttl=10

cakePHP アソシエーションしてるHasManyを条件文に

HasManyしているモデルを、コントローラー内で

動的に条件を指定してやりたい。

$this->[モデル名]->hasMany['関連モデル名']['conditions'] = '関連モデル名.del_flag = 0';
$data = $this->[モデル名]->findAll());

これでいけましたよ。と。

$this->[モデル名]->hasMany['関連モデル名']['conditions'] = null;

で戻してやったほうがいいかな。

fgetcsvで、日本語が入らない

エクセルデータで作ったcsvファイル(shift-jis)
を、phpでアップロードして、UTF-8に変換して
DBに突っ込むというところで、
日本語が消える現象が起こった。

$buf = mb_convert_encoding(file_get_contents($upload_data[0]['dir'].$upload_data[0]['file_name']), "UTF-8", "SJIS");
$handle = tmpfile();
fwrite($handle, $buf);
rewind($handle);

while($row = fgetcsv($handle)){

  }

このとき、fgets()でデータを取った場合だと、ちゃんと入るのに、fgetcsv()の場合
日本語が入らない(正確には、一部入ってるものもある)
windowsのローカル環境では問題ないのに、サーバ(Linux)では駄目。

これは、fgetcsv()関数が
「注意: この関数はロケール設定を考慮します。…」
であるためで、

setlocale(LC_ALL,'ja_JP.UTF-8');

をソースの初めに書いておくことで、対応できた。

実行環境によって、異なるので、ソースに書いておいたほうが
いいんでしょうね。

もっと、うまい方法もありそうだが。

出たな!改行コード

文字コードって苦手です。
改行コードも苦手です。

改行位置をあらわす為に、該当箇所に\r\nを書いたテキストファイルを
読み込んで、DBに突っ込むとき、

$value = str_replace("\r\n", "\r", $value);

を書いてたのだが、どうもうまくいかない。
これでは、何も変換されない。
(→改行コードの変換)

$value = str_replace('\r\n', '\r', $value);

すると、改行コードではなくて、\rに置き換わるだけ。
(→文字\r\nを文字\rに変換)

正解は

$value = str_replace('\r\n', "\r", $value);

(→文字\r\nを改行コード\rに変換)


微妙な違いですが、ちゃんと理解しとかなきゃ駄目ってことですね。

CakePHP モデルにカラム追加したのに、モデルで認識してくれない。

開発環境で、モデルにカラムを追加して
save()
したら、うまく入ったのに、

本番環境では、モデルが、新しいカラムを認識してくれない。

これにはまった。

結論から言うと、

config.php
define('DEBUG', 0);
になってたのが原因。

これによって、モデルをキャッシュとして持ってるので、

define('DEBUG', 1);

にして、キャッシュを持たないようにすれば、なおった。