Drupalの管理コマンド drushのインストール

drushはコマンドラインからDrupalの管理を行う事が出来ます。ダッシュボードからアップデートしたり、FTPすることなくコンソールからコマンドを叩くだけです。

実際にWordPressやDrupalをインストールしたり、モジュールのアップデートするときって、結局sshで入ってwgetして解凍してとかやることも多いのですが、Drupalの場合drushってのがあるよと先日Drupal Users Japan Group(仮)のmeetupで教えてもらいましたので、早速使ってみました。

インストールはpearコマンドで一発です。(Debianはapt-getでもいけるらしいです)

#pear channel-discover pear.drush.org
#pear install drush/drush

これでdrushのインストールは完了です。

Drupalがインストールされているディレクトリに移動して

$cd /var/www/drupal等/
$drush st

と実行すると

[root@ip-10-156-241-169 content]# drush st
Drupal version : 7.xx
 Site URI : http://default
 Database driver : xxxxx
 Database hostname : dbinstance.xxxxx.amazonaws
 .com
 Database username : xxxxx
 Database name : xxxxx
 Database : Connected
 Drupal bootstrap : Successful
 Drupal user : 匿名ユーザー
 Default theme : xxxxx
 Administration theme : seven
 PHP configuration : /php.ini
 Drush version : 5.7
 Drush configuration :
 Drupal root : /var/www/drupal
 Site path : sites/default
 File directory path : sites/default/files
 temp : /tmp

こんな感じで表示されればdrushはインストールされています。

モジュールやコアのアップデートをする場合は

$drush up

だけです。

drush upを走らせると、

Backups were saved into the directory [ok]

こんな感じでバックアップも取ってくれます。

アップデートの他に インストールやキャッシュのクリア等も行えるのでとても便利です。

またコンソールから実行可能なのでshファイル等で複数サイトを管理したりと利用範囲も広いかと思います。

cakePHP2でコマンド実行

cronで実行したかったのでcakePHP2でのシェル実行の仕方を調べました。

class MyShell extends Shell{
のようにShellを継承して作成出来るようです。
いくつもバッチを作成して共通化させたい場合はapp/Console/Command/AppShell.phpを作成せよとのことです。
バッチに使用するファイルは
app/Console/Command/MyShell.php
とCommandに配置します。
このバッチでコンポーネントを使用したかったのですがなかなか回答に辿りつきませんでした。
$component = array()とかは使えないようで、startup()を使用してインスタンス化させらます。
</span></pre>
<pre></pre>
&lt;?php
App::uses('ComponentCollection','Controller');
App::uses('JsonApiComponent','Controller/Component');
<pre></pre>
//共通化がいるならAppShellを作成する
class EvaShell extends Shell {
<pre></pre>
public function startup() {
$collection = new ComponentCollection();
$this-&gt;JsonApi = new JsonApiComponent($collection);
parent::startup();
}
public function main() {

$this-&gt;out("test");
$data = $this-&gt;JsonApi-&gt;getData();
}
}
<pre><span style="font-family:monospace;">

色々試した結果、ここに行き着きました。
裏付けはありませんw

/app/Console/Command/MyShell.php
で実行できます。
http://book.cakephp.org/2.0/en/console-and-shells.html

nginx+php-fpm+wordpress

マルチサイトで運用中のWordPressサーバが重くなってきたので、nginxの導入を行いました。

cent OSに入れるのでyumでインストールします。remiのリポジトリ使います。

現在はApacheとphpで動いています。

$sudo yum -y install nginx php-cli php-fpm –enablerepo=remi

インストールが完了したら

/etc/nginx/nginx.confを編集

バーチャルドメインの場合は/etc/nginx/conf.d/以下にapacheの設定のようにヴァーチャルドメインを追加する。
conf.d以下がnginx.confに読み込まれるので、拡張子は.confにする必要がある
    # Load config files from the /etc/nginx/conf.d directory
    include /etc/nginx/conf.d/*.conf;
こんな感じで読み込まれるため

/etc/nginx/conf.d/example.com.confとか
server {
    #WordPressマルチサイト
    listen 80;
    server_name example.com www.example.com example.net www.example.net;
    access_log /var/log/nginx/access_log;
    error_log /var/log/nginx/error_log;

    index index.php index.html;
    location ~ .*.php$ {
        root /var/www/example/htdocs;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
  //パーマリンク
    location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }
    //マルチサイト
    rewrite ^.*/files/(.*) /wp-includes/ms-files.php?file=$1;
}

もしCLI版を有効にしていなければ、php.ini等でapc.enable_cli=1を追記してください。

/etc/php-fpm.d/www.conf

user=nginx; group=nginx;
userとgroupはwordpressのディレクトリパーミッションにより
柔軟に対応してください。
uploads等を777にしている場合はどのユーザでもOK
apacheユーザやnobodyユーザへのみ書き込みを開けているユーザに変更する(擬似apache化w)
server_tokens off;
等の設定を行う。
/etc/rc.d/init.d/httpd stop /etc/rc.d/init.d/nginx start /etc/rc.d/init.d/php-fmp

これで起動 nginxでwordpressが動きます。

参考サイト

さくらのVPS CentOSでサーバ構築 21 – Nginx
楽しく情報処理技術者試験

 

 

CakePHPで複数形は大切

@kashiokaです。
アップが遅くなってしまいすいませんm(__)m

CakePHP Advent Calendar 2011の5日目を書かせていただきます。

ブログの移転を行うのに、バックアップを忘れてしまい。
googleのキャッシュからサルベージするという地道に作業を行ったのですが。
その際、昔のアクセスの多かったものについてリダイレクトの処理を入れてました。
(wordpressのプラグイン「Redirection」凄く便利です。)

そこでcakeのページを見たところ
複数形のページのアクセスが結構多かったため、このテーマをもう少し書いてみたいと思います。

bakeでモデルの生成の生成を行うと
Given your model named ‘Information’, Cake would expect a database table named information
というように言われる場合があります。
bakeの場合は結局は
Do you want to use this table? (y/n)
と聞かれて確認できるのですが、bakeしないで作成した場合等は注意が必要です。

CakePHPではテーブルの参照では、モデル指定の複数形が指定されます。
モデルbookであればbooks等
しかし上記エラーのようにinformationを指定した場合は、テーブル名はinformationとなります。
英語力無い、私だけかもしれませんが
よくモデルInformationを作成しては「DBつながらねー」見たいなことに陥ります。

基本的には規約にあったモデル名を使用するのが良いと思います。
どうしても規約に乗りたくない場合は

モデルの定義で
class Hogehoge extends AppModel {
var $name=’User’;
var $useTable=’Users_no_table_mei’;

のようにしてテーブル名を指定することが出来ます。

ちなみにこの処理を行っているのは
libs/inflector.php
でここに
単数形->複数形
複数形->単数形
複数形でも変わらない単語の処理が書いてあります。
一度、のぞいてみてください。

で話を戻しますが、元々のエラーのInformationは複数形もInformationなのです。
(自分でデータベース作ったりするとInformationsで作ったりして困ります。)

DBが参照出来ないときとか、一度複数形を疑ってみてみましょう!
とりあえずは辞書検索とか、、、(笑

ちなみに、この部分バグもあったみたい
http://cakephp.lighthouseapp.com/projects/42648/tickets/2149

1系ではnode_mediaというのが正しく表示されないようです。2で直っているようです。
(てかnode_mediaってなんだ?)

複数形にどんな風に変換されるかは
include_once(“cake/libs/inflector.php”);
$word = “node_media”;
echo “pluralize:”.Inflector::pluralize($word);

とかでできます。(cakephp的にしてなくてすいません)

ヘルパーにするなら
http://debuggable.com/posts/cakephp-pluralize-helper:480f4dfe-fbf8-464a-95da-4764cbdd56cb
にありました
class PluralHelper extends Helper {
function ize($s, $c) {
if ($c != 1) {
return $c . ‘ ‘ . Inflector::pluralize($s);
}
return $c . ‘ ‘ . $s;
}
}
のような感じでこのクラスを利用することができます。

ありがちなパターンでpeopleやwomanとか注意です!
ということで中学生の英語の授業って大切ですねw

少しでもinformationで繋がらない人が減ればと思います。

追記:次の@k1Lowさんから

CakePHPにおける複数形はCakePHP自体がどう判定するのかがInflectorクラス次第ですからね。
ちなみにcake.elはInflectorクラスをEmacs Lispでインプリメントして利用しているので安心です。

とのコメントいただきました。Emacs使いな方は試してみてください。
私はVi派なので、、、

雑文で失礼しました。

次は@k1LoWさんです!
みなさん、お楽しみに

No handlers for package.xml version 2.0

PEAR を使ってパッケージのインストールをしようとすると No handlers for package.xml version 2.0と怒られる場合があるこの場合はPEARのバージョンが古い可能性があるで # pear upgrade PEAR とかしたときにまた requires package `PEAR’ >= 1.3.3 PEAR: Dependencies failed とか怒られてしまう 1.3.3以前のPEARではこのupgradeが利用できないためとりあえずPEARを1.3.3にアップグレードする必要がある #pear upgrade PEAR-1.3.3 PHP Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 35 bytes) in /usr/share/pear/PEAR/PackageFile/v2.php on line 1175 Allowed memory size of 8388608 bytes exhausted (tried to allocate 0 bytes) とかエラーが発生する場合は php.iniの memory_limit = 8M ; Maximum amount of memory a script may consume (8MB) を16Mとかに上げてためすとインストールできる時があるサイズのでかいもののとき結構メモリを使うのか?

smartyのループ(foreach)

あれ?PHPだとforeachって0件でもループ入らなかったような気が…… smartyでforeachすると0件でも表示処理が行われてしまう。そのような場合はforeachelseを用いることで回避できる {foreach from=$app.items item=item} 表示処理 {foreachelse} データがありません {/foreach}

yahoo API にsimple_xmlでアクセス

XMLを取得するのに
$xml = @simplexml_load_file($req) or die (“error”);
として取得したところ
attributeに結果の件数等はいってきて
一見取得できるように思えたのだが
var_dumpで中身を見ても、欲しいデータが見つからなかった
上記指定だとCDATAの項目を取得しないのが原因のようだ
$xml = @simplexml_load_file($req , ‘SimpleXMLElement’ , LIBXML_NOCDATA) or die (“error”);
とオプションを指定することで、データの取得に成功した

WYSIWYGエディタ

CMSに組み込んで利用するために
ちょっとWYSIWYGエディタ調べてみた
改変を考えるとBSDかMITライセンスが便利か?
TInyMCEはyoutubeのボタンがあるらしいので
これも便利そう

Yahoo! UI Library: Rich Text Editor
BSDライセンス
http://developer.yahoo.com/yui/editor/

TinyMCE
LGPL
http://tinymce.moxiecode.com/
多言語対応

FCKEditor
LGPL
http://www.fckeditor.net/

NicEdit
MIT
http://nicedit.com/
軽い

SPAW
GPL
http://www.solmetra.com/en/disp.php/en_products/en_spaw/en_spaw_about

Ethna_Session

なんかプロバイダの関係かちょこちょこ接続IPが変わってて
Ethnaのセッションが上手く動いてなかった

Ethna_SessisonでREMOTE_ADDR見てるとこがあるので
最初isVallidを空でオーバライドしたんだけど
だめな場合があったので

session_start) {
if (!empty($_COOKIE[$this->session_name]) || session_id() != null) {
setcookie($this->session_name, “”, 0, “/”);
}
return false;
}
return true;
}
}
?>
のようにして
Controlerでこのセッションを利用するように記述した

cakePHP 日本語のヴァリデーション

デフォルトのグローバル関数(?)のmaxLengthでvalidationを行うと
strlenが利用されているため
日本語の文字数が正しくカウントされない
ヴァリデーションルールはカスタマイズチェックの場合と同様に
同一モデル内に記述すれば、こちらが参照されるので
function maxLength($data, $max) {
$str = array_shift($data);
$length = mb_strlen($check,mb_detect_encoding($str));
return ($length array(
‘rule’ => array(‘maxLength’, 25),
‘message’ => ‘名前は25文字以内で入力してください。’,
),
で変更せずにOKです