phpで外部コマンド実行(shell_exec)が上手くいかなかった時のメモ
2012年02月27日 13時54分
社内サーバでmailqを管理する簡易的なWebアプリを作っててはまったのでメモ。
目的
メールの即時配信をやめ、キューに溜めてWeb経由で閲覧・配信・削除をできるようにする。
CentOS / postfix
手順
-
1)postfixの設定(/etc/postfix/main.cf)に以下を追加してsmtpでの配信を即時配信ではなくメールキューに溜めるように設定。
-
-
2)phpでmailqueueの設定一覧を取得
-
|
$queue_list = shell_exec(escapeshellcmd(""/usr/sbin/postqueue -p"")) |
こちらはなんの問題もなく動いた
-
3)phpでmailqueueにあるメールを削除
-
|
$del_msg = shell_exec(escapeshellcmd("postsuper -d [キューID]")) |
こちらはさっぱり動かない。
戻り値も空なのでどうしたものか、、、とりあえず関数をsystemやpassthruに変えてみたけど変化なし。
標準エラー出力が取れていないのではと思い調べてみると後ろに”2>&1″を付けることで標準エラー出力も標準出力に吐き出せるので試してみる。
|
$del_msg = shell_exec(escapeshellcmd("postsuper -d [キューID] 2>&1")) |
これでもメッセージは何もでない。
コマンド自体間違っていないか実行したコマンドをechoしてターミナルから実行してみると正常に動作して消せる。
となると権限周りが怪しくなるのでsudoしてみることに。
|
$del_msg = shell_exec(escapeshellcmd("sudo postsuper -d [キューID] 2>&1")) |
とやっても何も動かない。
自分しか使っていないローカルマシンなのでセキュリティなど無視して以下に設定してみても駄目。
|
$: visudo #ADD apache ALL=(ALL) NOPASSWD: ALL |
しかし上記を追加してからエラーメッセージが表示されるようになった。
以下のようなもの。
|
sorry, you must have a tty to run sudo |
これでググってみるとvisudoで以下の行をコメントアウトすることにより解決するようだった。
|
$:vi /etc/sudoers Defaults requiretty ↓ #Defaults requiretty |
上で見事に解決。
無事にコマンドが実行されメールキューのメールが削除できました。
※自PC内のVMだからやりたい放題やっていますが外部サーバ等の場合はこの記事の内容はセキュリティ上問題が多いのでおすすめしません。
久々にゲームにはまった(Wiiであそぶピクミン2)
2012年02月11日 20時48分
考えてみれば近年、全くゲームをやらなくなっていた。
特に嫌いになった訳でもなく、ただ興味が湧かなくなったのが原因だ。
考えてみればもう5~6年ぐらいやっていないだろうか。
ハード的にはPlay Stationやセガサターンが家にある最新機種である。
ゲームに興味が湧かなくなったことに一抹の寂しさは感じるものの
大好きだった某大作PRGの続編が発売されてもワクテカのワの字も出てこないのだから仕方あるまい。
私も大人になったのだ……
と自分の中で結論付けていたのだがひょんなことから我が家にWiiがやってきた。
同時購入したソフトが「Wiiであそぶピクミン2」。
このCM曲が爆発的に売れた初代「ピクミン」の続編がWiiで3,500円と安価になって発売していたのである。
まぁ、ピクミンの概要に関しては説明など不要だろう。
発売当時はRPGオタだったのと発売機種がゲームキューブだったので興味の対象外だったが時を経てプレイすることとなった。
そして実際にやってみて見事にはまった。
クリアできそうで出来なさそうな絶妙なゲームバランス。
自然の摂理、食物連鎖を教えてくれるシステム。変な食育映画よりよっぽど良い。
萌えなさそうで萌えるキャラクターデザイン。
ゲーマーのコンプリート心をくすぐるチャレンジモード。
もう全てが完璧である。
すっかり夢中になってしまって仕事があるのに夜の3時辺りまでやる日々を1週間続けてクリアすることができた。
週の後半は流石に体調が悪くなってしまったのが社会人として反省する部分だが、失ってしまったと思ってた童心がまだあることが再確認出来て嬉しかった。
ゲームが好きになるとキャラクターグッズが欲しくなるのが人間心理というもの…
しかしゲーム自体は2004年に発売されたもので既に8年近く経っていてグッズに関しては勿論生産終了。
しかしもうお金に融通の利く社会人。
欲望のままにオークションで大人買い決行し以下の状態までもってけた。
約2万円かかった。
社会人万歳だ。
IEのみでJavaScriptエラー「標識子、文字列または数がありません。」
2012年01月31日 16時49分
IEだけで警告が出る箇所があって何かなぁ?と思っていたらカンマだった。
連想配列で最後にカンマがあると他のブラウザだとエラーを吐かずにIEだと吐くらしい。
|
var hoge = { a : "b", // ←ここの「,」 }; |
これはIEの動きが正しいな。
2、3カ月前に自分が治したらしいのだが全く記憶にないのでメモメモ…
SQL ServerからMySQLへする時にQueryではまったこと
2012年01月26日 16時53分
SQL Server用に作成したQueryをMySQLで動かしたら動かない動かない…
ということではまった点を記述。
1.SELECT INSERT 文
よく既にレコードが存在する場合はINSERTしないという場合に以下のように記述していた。
|
INSERT INTO table1(v1, v2) SELECT '値1', '値2' FROM table1 WHERE NOT EXISTS(SELECT * FROM table1 WHERE v1 = '値1' AND v2 = '値2') |
v1辺りが主キーと思ってみてほしい。
既にレコードが存在している場合はレコードを登録しないというQueryだ。
しかしMySQLだとこのQueryは動かない。
NOT EXISTSだろうがEXISTSだろうが行が取れないためにレコードが登録されなかった。
|
INSERT INTO table1(v1, v2) SELECT * FROM (SELECT '値1' AS c1, '値2' AS c2) tbl WHERE NOT EXISTS (SELECT 1 FROM table1 WHERE v1 = '値1' AND v2 = '値2') |
と一つサブクエリを挟むことで行が作成されレコードが登録されるようになる。
2.
DELETE文などで自分自身をサブクエリで参照することはできない
|
DELETE FROM tbl1 WHERE key IN ( SELECT key FROM tbl1 WHERE key2 = 'hoge' ) |
サブクエリ使わずにそのまま書ける文だがわかりやすくする為に完結なQueryにした。
key2の値がhogeのレコードのkeyの値を持つレコードを削除するという文だ。
これがMySQLではエラーになる。
※参考サイト
http://hamamuratakuo.blog61.fc2.com/blog-entry-427.html
上記の問題にあたったらSelect文とDELETE文を分けれる場合は分けた方が無難だろう。
3.
AUTO_INCREMENTは物理削除すると削除した番号を再利用する
SQL ServerのIDENTITYと同じ感覚で使用するとはまる。
主キーとして使用するには注意が必要。
iTunesで再生した曲をブログ(wordpress)に表示する
2011年12月29日 22時44分
右にある「最近聞いてる曲」ってウェジット。
案外設置に手間取ったのでメモ代わりに記載。
このウェジットはlast.fmのプラグインlast.fm Live!で対応した。
使用しているwordpressは3.2.1。
last.fmはSNSらしいけど自分の使い方は専ら自分が再生した曲の累計を眺めてニヤニヤしているのみ。
月に何曲聴いたとかもわかるし自分が予想していなかったアーティストが自分の再生ランキング上位にくることもある。
個人での使用でも十分楽しいのでお勧めである。
ちなみに俺のランキングTopは断トツでKOTOKO。2位のナイトメアにダブルスコア以上という状態w
設定も上のサイトでユーザー登録したらその後ここで連携用ソフトをインストールすれば終了。
至って簡単である。
・lastfm-rps
http://blog.hamamoto.info/archives/134.html
・lastfm-recently-played-tracks
http://wordpress.org/extend/plugins/lastfm-recently-played-tracks/
検索してみると上位に出てきた上の2つは2.xシリーズの時に開発されたらしく3.xシリーズだと警告が出て上手く動かない。
エラーの内容はregister_sidebar_widgetはもう使えないからwp_register_sidebar_widgetを使えというような感じのやつ。
調べてみたけど結構修正を加えないと駄目そうだったのでスパっと諦めた。
・lastfm-records
http://wordpress.org/extend/plugins/lastfm-records/
こちらはすんなり動いたけど見た目が残念。
↓こんな感じ
・lastfm-live
http://wordpress.org/extend/plugins/lastfm-live/
最終的に使用したのはこのlastfm-liveというプラグイン。
使用している3.xでもエラーがあまり出なく少しの修正で警告無しに持っていけて見た目の編集もテンプレートが分かれてて触りやすい。
プラグインのメモをしつつlast.fmが日本でももっと普及すれば嬉しいんだけどなぁ。