ラベル php の投稿を表示しています。 すべての投稿を表示
ラベル php の投稿を表示しています。 すべての投稿を表示

2011年7月16日土曜日

macにapache、mysql、phpをインストールしてWeb開発

macでWeb開発をするときにいつもやってることメモ。

いわゆるMAMPとかを使わずに、apache、mysql、phpをインストールしてローカルで開発する手順です。自分用。
ドメインをhostsに設定して切り替えて開発します。

・ MacPortsを最新版にアップデートしておく
$ sudo port -d selfupdate
$ sudo port -d sync
・ apacheを入れる
$ sudo port install apache2
・ MySQLを入れる
$ sudo port install mysql5 mysql5-server
・ phpを入れる。オプションでpearとか有効にしておく
$ sudo port -d install php5 +apache2 +curl +mysql5 +pear +mbstring
・apache moduleのphp5を有効に。
$ sudo /opt/local/apache2/bin/apxs -a -e -n "php5" /opt/local/apache2/modules/libphp5.so
[activating module `php5' in /opt/local/apache2/conf/httpd.conf]


・MysqlのDBをセットアップ
$ sudo -u mysql mysql_install_db5
・サーバの起動
$ sudo /opt/local/share/mysql5/mysql/mysql.server restart
・Mysqlのパスワードを設定(以下はrootアカウントを設定する場合)
$ /opt/local/lib/mysql5/bin/mysqladmin -u root password '*********'
・Mysqlにログインしてみる
$ /opt/local/lib/mysql5/bin/mysql -u root -p


・apacheのconfigを修正
$ sudo vim /opt/local/apache2/conf/httpd.conf
httpd.conf
<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

<IfModule mime_module>
    AddType application/x-httpd-php .php .html .htm
</IfModule mime_module>

# これをやらないと.htaccessが有効にならない
<Directory "/opt/local/apache2/htdocs">
    AllowOverride All
</Directory>

# Virtual hosts
Include conf/extra/httpd-vhosts.conf


・apacheのVirtualHostを設定
$ sudo cp /opt/local/apache2/conf/extra/httpd-vhosts.conf /opt/local/apache2/conf/extra/httpd-vhosts.conf_bak
$ sudo vim /opt/local/apache2/conf/extra/httpd-vhosts.conf
httpd-vhosts.conf(※hogehoge.comを適当に読み替え)
#
# Virtual Hosts
#
NameVirtualHost *:80

<VirtualHost *:80>
    DocumentRoot "/opt/local/apache2/htdocs/phpmyadmin"
    ServerName phpmyadmin
    ErrorLog "/opt/local/apache2/logs/error_log"
    CustomLog "/opt/local/apache2/logs/error_log" common

    <Directory "/opt/local/apache2/htdocs/phpmyadmin">
        Order deny,allow
        Allow from All 
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/opt/local/apache2/htdocs/hogehoge.com"
    ServerName hogehoge.com
    ServerAlias www.hogehoge.com
    ErrorLog "/opt/local/apache2/logs/hogehoge.com/error_log"
    CustomLog "/opt/local/apache2/logs/hogehoge.com/access_log" common

    <Directory "/opt/local/apache2/htdocs/hogehoge.com">
        Order deny,allow
        Allow from All 
    </Directory>
</VirtualHost>
・ログ用ディレクトリを作る
$ sudo mkdir /opt/local/apache2/logs/hogehoge.com
$ sudo chmod 777 /opt/local/apache2/logs/hogehoge.com
・apache再起動など
$ sudo /opt/local/apache2/bin/apachectl start
$ sudo /opt/local/apache2/bin/apachectl stop
$ sudo /opt/local/apache2/bin/apachectl restart


・MySQL用の設定を変更
$ sudo vim /opt/local/etc/mysql5/my.cnf
my.cnf
[mysqld]
max_allowed_packet=256M

・MySQL再起動など
$ sudo /opt/local/share/mysql5/mysql/mysql.server restart
(※必要ならばDB流しこみ)
$ sudo /opt/local/lib/mysql5/bin/mysql -uroot -p****** dbname < ~/hogehoge.sql


・pear関連
$ sudo pear install Cache_Lite
など。

・PHP Extension関連
$ sudo port install php5-mbstring
$ sudo port install php5-curl
$ sudo port install php5-mysql
$ sudo port install php5-iconv
($ sudo port install php5-imagick)

・hostsを編集
$ sudo vim /etc/hosts
/etc/hosts
127.0.0.1   localhost
127.0.0.1   phpmyadmin
127.0.0.1   hogehoge.com

・phpmyadminを設定
$ chmod 777 /opt/local/apache2/htdocs/
phpmyadminを落としてくる(今回は phpMyAdmin-3.4.3.1-all-languages )
$ mv ~/Downloads/phpMyAdmin-3.4.3.1-all-languages /opt/local/apache2/htdocs/.
$ cd /opt/local/apache2/htdocs/
$ ln -s phpMyAdmin-3.4.3.1-all-languages phpmyadmin


・phpの設定ファイルを修正
$ sudo cp /opt/local/etc/php5/php.ini-development /opt/local/etc/php5/php.ini
$ sudo vim /opt/local/etc/php5/php.ini
php.ini
pdo_mysql.default_socket =/opt/local/var/run/mysql5/mysqld.sock
mysql.default_socket =/opt/local/var/run/mysql5/mysqld.sock
mysqli.default_socket =/opt/local/var/run/mysql5/mysqld.sock
short_open_tag = On

2011年7月15日金曜日

Eclipse(Ver3.7)とPDTを使ってPHP開発。あとgitも。

Eclipseでのphp開発メモ。あとgitも。


Eclipseのダウンロード
Eclipse Downloadsから、「Eclipse IDE for JavaScript Web Developers」のMAC OS X 64 bit版をダウロード。
Eclipseのバージョンは3.7 (indigo)でした。

ダウンロードしたら、インストールして起動。

はじめのworkspaceの設定は自分はDocumentRootにしています。
(macなので/opt/local/apache2/htdocs に設定)


プラグインPDT (PHP Development Tools) を入れる。
PHPの開発用プラグインを入れる。Eclipse3.7にはパッケージインされてなかったので別途入れる。

メニューの「Help --> Install New Software」から。

Work Withは、プルダウンから「 Indigo - http://download.eclipse.org/releases/indigo 」を選択。


プラグインEgitを入れる。
gitを使いたいので、上記PDTと同じくindigoリポジトリからEgitを入れる。

昔は別途インストールの必要があったみたいだけど、Eclipse3.7からは直接indigoリポジトリの中からインストールできるみたい。


プラグインVrapperを入れる。
Eclipse上でvimキーバインドで開発できるプラグイン。基本はvimを使っているので。

Vrapperのインストールは、Eclipseの更新サイトに"http://vrapper.sourceforge.net/update-site/stable"を設定してインストールする。


その他
Workspaceの文字設定をUTF-8にする。
「Preferences → General →  Workspace」をクリック。
その中の Text file encoding をUTF-8に変更。


参考
Eclipseのキーバインドをvim風にできるVrapperが素晴らしすぎる件について - ゆろよろ日記
Eclipseの文字コードをutf-8に設定する
ウノウラボ by Zynga Japan: EclipseでPHP開発

2011年2月16日水曜日

macでphp用のiconvをいれる

こんなエラーが出た
Fatal error: Call to undefined function iconv_get_encoding()

macのiconv関連php拡張が入ってないみたい。

インストール
$ sudo port install php5-iconv

これでOK。

Imagickで画像を正方形にリサイズ

ImageMagickのphp版Imagickを使って画像を正方形にリサイズしたい。

画像を正方形にリサイズする場合、
正方形に切り抜く場合と、余分な背景をうめて正方形にする2パターンがある

<?php
// 正方形に切り取る
$im = new Imagick();
$im->readImage('/home/kasahi/tmp/org.jpg');
$im->cropThumbnailImage(80, 80);
$im->writeImage('/home/kasahi/tmp/resize.jpg');
$im->destroy();
?>

<?php
// 余りの背景を白でうめて正方形にする場合
$im = new Imagick();
$im->readImage('/home/kasahi/tmp/org.jpg');
$sideNum = 300; // 一辺を300ピクセルにする
$im->setImageBackgroundColor(new ImagickPixel('white'));
if ($im->getImageWidth() > $im->getImageHeight()) {
    $im->scaleImage($sideNum, 0); 
    $height = ($sideNum - $im->getImageHeight()) / 2;
    $im->spliceImage(0, $height, 0, 0); 
    $im->spliceImage(0, $sideNum - $im->getImageHeight(), 0, $im->getImageHeight());
} else {
    $im->scaleImage(0, $sideNum);
    $width = ($sideNum - $im->getImageWidth()) / 2;
    $im->spliceImage($width, 0, 0, 0); 
    $im->spliceImage($sideNum - $im->getImageWidth(), 0, $im->getImageWidth(), 0); 
}
$im->writeImage('/home/kasahi/tmp/resize.jpg');
$im->destroy();
?>

2011年2月15日火曜日

CentOS 5.5のImageMagickのバージョンを上げる

peclのimagickでgetImagePropertyを使おうと思ったら、なぜか
PHP Fatal error: Call to undefined method Imagick::getImageProperties()

マニュアルみたら、
PHP: Imagick::getImageProperty - Manual

ImageMagick version 6.3.2 or newer.

になってる。

で、CentOS5.5のImageMagickのバージョンを見てみると、
$ convert -v
Version: ImageMagick 6.2.8 08/28/09 Q16 file:/usr/share/ImageMagick-6.2.8/doc/index.html
Copyright: Copyright (C) 1999-2006 ImageMagick Studio LLC
で6.2.8だった。

バージョンを上げないとimagickのgetImagePropertyが使えないみたい。

ということで上げる。

uninstall old ImageMagick
$ sudo yum remove ImageMagick


get new ImageMagick sources
$ wget ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz

untar and configure, make, install
$ tar zxvf ImageMagick.tar.gz
$ cd ImageMagick-6.6.7-7
$ ./configure --disable-static --with-modules --without-perl --without-magick-plus-plus --with-quantum-depth=8 --disable-openmp
$ make
$ sudo make install
※configureのオプションに関しては↑を付けておいたほうがよさげ。
-->kasahi memo: ImageMagick(imagik)がsegmentation faultするようになってしまった。

チェック。
$ convert -v
Version: ImageMagick 6.6.7-7 2011-02-15 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC
OK。


あとは、peclのimagickを元々使ってたので、一度削除して、再インストール

$ sudo pecl uninstall imagick

で、再インストール。
$ sudo pecl install imagick

これでOK。

そしてhttpdを再起動
$ sudo /etc/init.d/httpd restart

これで無事バージョンが上がって、関数も使えるようになりました。

CentOS 5.5にImageMagick for PHPを入れる

手始めにpecl経由でインストールしようとすると、、
$ sudo pecl install imagick

------------
.....................done: 93,920 bytes
13 source files, building
running: phpize
sh: phpize: command not foundERROR: `phpize' failed
------------
と言われる。phpizeがないみたい。

phpizeを使うために、
$ yum -y install php-devel
を入れる。

再挑戦

$ sudo pecl install imagick

------------
.....................done: 93,920 bytes
checking whether to enable the imagick GraphicsMagick backend... no
checking ImageMagick MagickWand API configuration program... configure: error: not found. Please provide a path to MagickWand-config or Wand-config pr
ogram.
ERROR: `/var/tmp/imagick/configure --with-imagick' failed
------------

ありゃ、もっかいエラー。調べる。

-参考
--[php]PECLコマンドが成功するまでのエラー解決備忘録(imagick編) : うえちょこ@ぼろぐ

ImageMagick-develを入れればよさげ。
というわけでyum経由でインストール。
$ sudo yum -y install ImageMagick-devel

------------
..........
Installed:
ImageMagick-devel.x86_64 0:6.2.8.0-4.1

Dependency Installed:
ghostscript-devel.x86_64 0:8.15.2-9.12.el5_5
lcms-devel.x86_64 0:1.18-0.1.beta1.el5_3.2 
libICE-devel.x86_64 0:1.0.1-2.1
libSM-devel.x86_64 0:1.0.1-3.1
libXext-devel.x86_64 0:1.0.1-2.1
libXt-devel.x86_64 0:1.0.2-3.2.el5

Dependency Updated:
ghostscript.x86_64 0:8.15.2-9.12.el5_5

Complete!
------------

入ったっぽい。 


再々挑戦

$ sudo pecl install imagick

------------
........
Build process completed successfully
Installing '/usr/lib64/php/modules/imagick.so'
Installing '/usr/include/php/ext/imagick/php_imagick_defs.h'
Installing '/usr/include/php/ext/imagick/php_imagick_shared.h'
Installing '/usr/include/php/ext/imagick/php_imagick.h'
install ok: channel://pecl.php.net/imagick-3.0.1configuration option 
"php_ini" is not set to php.ini location
You should add "extension=imagick.so" to php.ini
------------

うまく行ったっぽい。

iniファイルに追記(ファイル名はなんでもOK)

$ sudo vim /etc/php.d/imagick.ini
imagick.ini
extension=imagick.so

2010年9月28日火曜日

zendのgetParam()はデフォルト値を取れる

使い始めのころは知らなかった。
いちいち空チェックをやってた。

たとえばページ番号なんかをpageパラメータから取得するときに
$page = $this->getRequest()->getParam('page', 1);
とかやれば、pageパラメータにデフォルトで1が入る。


まぁ普通にソース見てもいいし、ドキュメントにも書いてあるので、
とりあえず、API Documentationは一通り見ようと思った。

Zend Framework API Documentation

Zend FrameworkのMimeType Validatorがうまく動かない。

Zendを使っていて、
Zend_File_Transfer_Adapter_Httpでファイルをアップロードするとき、
$adapter->addValidator('MimeType', false, array('image/gif', 'image/png', 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/x-png')); // jpg, png, gif
こんなんとか、
$adapter->addValidator('IsImage', false);
こんなんとかを使ってMimeTypeのチェックをしようと思ったが、なぜかうまくいかない。

見ると、
Zend_Validate_File_IsImage::NOT_DETECTED
のエラーを吐いてる。

どうやらmimetypeが取得できないみたい。

コードに問題はなさそうだし、なんか挙動がよくわからないので、Zend/Validate/File/MimeType.php の中身を見る。

追っていくと、途中の

} else if (!(class_exists('finfo', false))) {

に引っかかって Exceptionが飛んでる。

どうやらfinfoがないみたい。
調べると pecl経由でfileinfoを入れればよさそう。
(自分の環境はCentOS 5.5)

一応チェック
$ php -i | grep fileinfo
(何も出ない)

なので、やっぱり入ってないみたい。
うーむ、しかし内部的に finfo_open()を使ってるんだなー。。。

というわけで、fileinfoをインストール。

peclでphpizeを使うため、手始めにphp-develをインストール。
$ sudo yum install php-devel

.....

Installed:
  php-devel.x86_64 0:5.2.10-1.el5.centos

Complete!

続いて、peclコマンドでfileinfoをインストール。
$ sudo pecl install fileinfo

.....

Build process completed successfully
Installing '/usr/lib64/php/modules/fileinfo.so'
install ok: channel://pear.php.net/Fileinfo-1.0.4

これでOK。
あとは設定ファイルに書いてモジュールをロードする。

$ sudo vim /etc/php.d/fileinfo.ini

extension=fileinfo.so

で再起動。

$ sudo /etc/init.d/httpd restart
httpd を停止中: [ OK ]
httpd を起動中: [ OK ]

$ php -i | grep fileinfo
/etc/php.d/fileinfo.ini,
fileinfo
fileinfo support => enabled

enabledになってればOK


これでMimeTypeのチェックがちゃんと動いた。

2010年9月21日火曜日

javascriptでphpのisset()的な振る舞い

var hash = {a:'hoge', b:'piyo', c:'huga'}
if (hash[a]) {
    //exsist a
}
これだけでいいらしい。

PHPからTwitter APIのOAuthを使って投稿

OAuthを使ってtwitterで投稿するためには、consumer_key、consumer_secret、auth_token、token_secretの4つが必要になる。


consumer_key、consumer_secretを取得

これは、twitterのアプリを登録してkeyをもらう感じ。

Twitter / アプリケーション
にアクセスして、アプリケーションを登録。

登録すると、登録したアプリ用の「consumer_key」と「consumer_secret」が表示されるのでそれをメモっておく。


auth_token、token_secretを取得

上のアプリを使うアカウントのkeyを取得する感じ。

2010-01-24 - hirokan55の日記のサイトを参考に、
Downloads for abraham's twitteroauth - GitHubからabraham-twitteroauth-XXXXX.zipを落としてきて、
どこか自分のサーバにファイル群を置き、
config.phpのCONSUMER_KEY、CONSUMER_SECRETを上のアプリのkeyに、OAUTH_CALLBACKをおいたcallback.phpのURLとして修正する。

そのあと、index.phpにアクセスし、twitter側に認可を求めて、OAuth tokenとOAuth token secretを発行してもらう。

で、表示されたOAuth tokenとOAuth token secretをメモっておく。


ここまでで、consumer_key、consumer_secret、auth_token、token_secretの4つがわかったので、あとはこれを使って投稿するだけ。


投稿のやり方はたくさんあるけど、今回はpearのservices_twitterとHTTP_OAuthを使った。


まずインストール

services_twitterを入れる
$ sudo pear install --force services_twitter
.....
Starting to download Net_URL2-0.3.1.tgz (8,488 bytes)
...done: 8,488 bytes
install ok: channel://pear.php.net/Net_URL2-0.3.1
install ok: channel://pear.php.net/HTTP_Request2-0.5.2
install ok: channel://pear.php.net/Services_Twitter-0.6.2

HTTP_OAuthを入れる(stableがないので今回は0.1.18のバージョン指定で入れる)
$ sudo pear install HTTP_OAuth-0.1.18
.....
downloading HTTP_OAuth-0.1.18.tgz ...
Starting to download HTTP_OAuth-0.1.18.tgz (51,237 bytes)
.............done: 51,237 bytes
install ok: channel://pear.php.net/HTTP_OAuth-0.1.18


サンプルコード
require_once 'Services/Twitter.php';
require_once 'HTTP/OAuth/Consumer.php';

try {
    $twitter = new Services_Twitter();
    $oauth   = new HTTP_OAuth_Consumer(
       'メモったconsumer_key',
       'メモったconsumer_secret',
       'メモったauth_token',
       'メモったtoken_secret'
    );
    $twitter->setOAuth($oauth);
    $msg = $twitter->statuses->update("OAuth経由でTwitterに投稿するよ。");
} catch (Services_Twitter_Exception $e) {
    echo $e->getMessage();
}


参考
- 2010-01-24 - hirokan55の日記
- PHPでTwitter APIのOAuthを使う方法 - memo.xight.org

2010年9月9日木曜日

Zend_Logを使ってファイルにログを吐く

Zend_Logを使ってファイルにログを吐くときの個人的な定型
require_once("Zend/Log.php");
require_once("Zend/Log/Writer/Stream.php");
require_once("Zend/Log/Filter/Priority.php");
require_once("Zend/Log/Formatter/Simple.php");

// output format
$time = date('Y/m/d H:i:s');
$format = "{$time} %priorityName% (%priority%): %message%" . PHP_EOL;
$formatter = new Zend_Log_Formatter_Simple($format);
$writer = new Zend_Log_Writer_Stream('/****/****/****/logs/error_log'); // set log file path
$writer->setFormatter($formatter);

// setting log level
$filter = new Zend_Log_Filter_Priority(Zend_Log::DEBUG);
$log = new Zend_Log();
$log->addWriter($writer);
$log->addFilter($filter);

// write log
$log->debug('hogehoge');

PHP Fatal error: Class 'DOMDocument' not found

こんなんでた
PHP Fatal error:  Class 'DOMDocument' not found in /****/app/zf/library/Zend/Gdata/App/Base.php on line 210

これをいれる
$ sudo yum install php-xml

- Fatal error: Class ‘DOMDocument’ not foundと出たら: PHPの種 ブログ

2010年8月18日水曜日

peclのgeoipを使う

PECL::Package::geoipを使いたい。
で、peclでinstallコマンド叩いてみたけどgeoipがはいらない。(環境はCentOS 5.5です)

$ sudo pecl install geoip
downloading geoip-1.0.7.tgz ...Starting to download geoip-1.0.7.tgz (9,416 bytes).....done: 9,416 bytes
....
checking for geoip files in default path... not found
configure: error: Please reinstall the geoip distribution
ERROR: `/var/tmp/geoip/configure' failed

調べた。
- Problems installin GeoIP - PHP

geoip-develを入れてみるといいらしい。

$ yum install geoip
$ yum install geoip-devel

geoip-devel入れてもう一度。
$ sudo pecl install geoip
..........
Build process completed successfully
Installing '/usr/lib/php/modules/geoip.so'
install ok: channel://pecl.php.net/geoip-1.0.7
configuration option "php_ini" is not set to php.ini location
You should add "extension=geoip.so" to php.ini

入った。

php.iniに追記
; Enable geoip extension module (added by kasahi 2010/08/17)
extension=geoip.so

geoip.phpを作ってたたいてみる。
<?php
$host = 'www.yahoo.co.jp';
var_dump(geoip_country_code_by_name($host));
?>
$ php geoip.php
string(2) "JP"
www.yahoo.co.jpは日本にあるそうです。