コマンドラインからの実行でエラーが発生する問題について

このQ&Aのポイント
  • phpであるページから文字列を抽出するプログラム(FILE.php)を作成しました。
  • ブラウザで実行する場合は正常に動作しますが、コマンドラインから実行すると文字列を見つけられません。
  • cronからphpファイルを呼び出して実行したいのですが、動作しません。原因を特定できません。
回答を見る
  • ベストアンサー

ブラウザで実行する場合はOKだが、コマンドラインから実行するとエラーが出る問題について

phpであるページから文字列を抽出するプログラム(FILE.php)を書きました。 簡単に書くと以下の様なプログラムです。 file_get_contents($url); strip_tags($result); mb_convert_encoding()で文字列をSJISに変換 mb_ereg() 正規表現で文字列を抽出 ブラウザで実行すると、mb_eregで指定した文字列をきちんと見つけてくれますが、コマンドラインから実行した場合では文字列を見つけられません。 cronからphpファイルを呼び出して実行したいのですが、上手く動作してくれません。 原因がわからず困っています、宜しくお願いします。

  • PHP
  • 回答数3
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.3

#2です。 mb_stringを使う際には文字コードを指定する必要があります。 php.ini またはスクリプト中のini_set()で指定します。 デフォルトはたしかLatin-1(ヨーロッパ文字)とかです。これがデータとあってないとmb_string関数は正しく動きません。 おそらく、ウェブ環境だけ正しく設定されて、コマンドライン環境(cgi環境もしくはcli環境)で正しく設定されていないと思われます。私がアドバイスしたとおり、コマンドライン環境でのphpinfo()を見て、文字コードセット指定部分をウェブ環境のphpinfo()と同じになるように、ini_set()で設定してください。

narusuji
質問者

お礼

ありがとうございます。 おっしゃる意味がやっと分かりました。 ブラウザで実行したphpinfo()とコンソールから実行したphpinfo()では内容が違いました。 .htaccessでphp.iniファイルの設定をしたつもりでしたが、これはブラウザに適応されるんですね。 コンソールからphpinfo()を実行し、出力結果ファイルをhtml形式で保存しそれぞれ確認したところ、コンソールのphpinfoはデフォルト設定のままでした。 mbstring.internal_encodingの部分がそれぞれ、SJISとEUCでしたのでアドバイスどおり、 ini_set("mbstring.internal_encoding","SJIS"); を追加したところコマンドラインからでもちゃんと動作しました。 完璧のパーフェクトです。 ありがとうございました!

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

「エラーが出る問題」と書いてありながら、エラーメッセージが書いてないです。 コマンドライン環境(cgiなのか、cliなのか??)では、mb_string関係の設定がなされていないのでは? echo '<?php phpinfo();?>' | php で、調べて、おかしければini_set()で設定するのかな。

narusuji
質問者

お礼

ご回答ありがとうございます。 XREAを使用しています、mb_stringを問題なく使える環境です。 以下の様に変数$tempに入れた日本語の文章から、欲しい文字列を探しています。 if(mb_ereg("文字列.+?もじれつ",$temp,$match)){ print "$match[0]"; } if(mb_ereg("モジレツ.+?モジレツダヨ",$temp,$match)){ print "$match[0]"; } ブラウザで上記内容のphpファイルを実行すると漢字、カタカナどちらも指定した文字列を見つけてブラウザの画面に出力してくれます。 が、コマンドラインから php filename.php と実行すると"mbregex compile err"とエラーが出ます。 指定されたエラー行は、mb_ereg("カタカナ",$temp,$match)でした。コマンドラインから実行する場合、カタカナ行を検索する時にエラーが起こっている様です。(mb_ereg()で\xを使い、バイナリ形式に変更してみましたがカタカナの文字列を検索する時だけエラーが起こりました。) 自宅パソコンにdebian環境でapache,phpなどをインストールし同じケースで実行してみたところエラーは出ませんでした。 何について理解不足なのかわからず少し混乱しています。 しばらく試行錯誤してみたいと思います。説明不足で申し訳ありません。

  • tompink
  • ベストアンサー率50% (6/12)
回答No.1

パーミッションは正しいですか?直接phpを実行するには、パーミッションの設定を正しく行うことが必要です。 また、phpファイルはcronから直接起動できない(詳しくは分からないが、以前できなかった経験が・・・)場合があるので、間接的にシェルスクリプトなどを利用してやってみてください。

narusuji
質問者

お礼

ご回答ありがとうございます。 シェルスクリプトからphpファイルを実行しています。 cronからシェルスクリプトは実行されていますが、phpのプログラム自体に問題があるのかもしれません。

関連するQ&A

  • mb_eregを使っての文字列検索、抽出について

    パターン="関数.+ます。" 上記パターンで、"関数"から"ます。"までを含む文字列を抽出する事は出来ました。が、 一番最初に出てくる"ます。"で検索をストップし、変数$matchに代入する事はできますか? (指定したキーワード"関数"以降の全ての"ます。"が変数に代入されてしまいます、最初に出てくる"ます。"まで抽出できれば充分なので。) キーワードやアドバイスがあればお教え下さい。 宜しくお願いします。 以下のプログラムで実行しました。 <?php //mb_eregについて $url="http://jp2.php.net/mb_ereg"; //アドレス指定 $result=file_get_contents($url);//取得 $text_contents=strip_tags($result);//タグを外す $sjis_text=mb_convert_encoding($text_contents,"SJIS","auto");//sjisに変換 echo("$sjis_text<br>");//本文出力 echo("----------------------------------------------<br>"); if(mb_ereg("関数.+ます。",$sjis_text,$match))//"関数"から"ます。"まで検索 echo("$match[0]<br>");//検索結果表示 ?>

    • ベストアンサー
    • PHP
  • RSSで取得したデータが文字切れする件について

    PHPでRSSのデータを取得し表示するプログラムを作成しています。 以下の文で記事の本文を取得することはできるのですが、何故か文字切れしてしまいます。文字切れする最後の文末は必ず「...」で終了してしまいます。 $desc = mb_convert_encoding(strip_tags($ch[$i]['items'][$n]['description']), $code, "UTF-8,EUC-JP,SJIS"); このような場合、どう回避したら良いでしょうか? また上記内容で情報不足していたらご指摘下さい。

    • ベストアンサー
    • PHP
  • 文字エンコードについて

    Blogの更新をPHPで挑戦してみたのですが、文字化けしちゃって訳がわかりません… PHPのバージョンは5.1.6.6でバッチファイルを使用してます。 色々調べてみた結果Blogの方の文字コードがShift_JISみたいなので (PHPは基本UTF-8ですよね?) mb_convert_encodingかmb_convert_variablesの関数かなと思って使用してみたのですが結果はエラーがおきてしまい↓↓どうしていいのか分かりません、、 mb_convert_encoding(変換したい文字列, "SJIS", "auto"); mb_convert_variables("JIS", "UTF-8", 変換したい文字列); autoのところをUTF-8にしてもおなじでした… もちろん一つずつ試しました。 どなたかいい解決方法を教えて頂けませんか?

    • 締切済み
    • PHP
  • PHPの文字コード変換について

    PHPで mb_convert_encodingを用いて UTF-8で記述されたPHPスクリプトファイルの PHPファイル内の任意の文字列の文字コードを変換する場合、 $value = "文字列"; $str = mb_convert_encoding($value ,"UTF8","UTF8"); print $str; この場合、特に問題なく、変換がおこなわれます というか、意味のないで処理ではありますが。 次に $str = mb_convert_encoding($value,"EUC-JP","EUC-JP"); とした場合 うまく文字列の文字コードの変換がおこなわれず 出力内容は文字化けします。 次に $str = mb_convert_encoding($value,"SJIS","SJIS"); とした場合 EUC-JPと同じく文字コード変換に失敗し 文字化けするだろうとおもいましたが おもいのほかブラウザの文字コードUTF-8のままで文字化けしていないのです。 これはどういう現象でしょうか? たとえば一つ目は UTF8で記述されたPHPファイルの文字列をそのままUTF-8として 変換されせるのですから、問題ないはずです。結果問題ありません。 二つ目は UTF-8でかかれたPHPファイルの文字列をEUC-JPでかかれたファイルとして EUC-JPという文字コードに変換しなさいという命令ですよね? これは思う通りにいかなくて文字化けした文字列が出力されるのはわかるのですが 三つ目はUTF8で記述された文字列をSHIFT-JISとしてSHIFT-JISに変換しようとしているにも かかわらず、結果問題なくブラウザのUTF-8で文字列と表示されてしまいます。 これはいったいどういう事なのでしょうか? これが仮に $str = mb_convert_encoding($value,"SJIS","UTF-8"); なら話は簡単んです。 UTF-8で記述されたファイルの任意の文字列を UTF8からSJISに変換しようとしているのですから問題なく SHIFT-JISでエンコーディングされた文字列が帰ってくるはずです。 こ乃原因をご存知のかたよろしくご教授ください。 お願い致します。

    • ベストアンサー
    • PHP
  • SJIS→EUCに送っても文字化けしない

    htmlは、SJISで作っています。 PHPは、EUCで作っています。 普通は文字化けをするため、mb_convert_encoding関数を用いますが、 なぜか、この関数を使わなくても、文字化けしません。 友人は、有り得ないと言います。 事実、友人PCではmb_convert_encoding関数で文字化けを直してました。 私も友人に同感で、SJIS→SJISやEUC→EUCなら文字化けしないけど、文字コードが違うのです。違うから、mb_convert_encoding関数を使うと、思っているのですが‥‥ 設定が違うのかと思い、友人の、php.iniなどいくつかのファイルを私のPCに上書きしてもらいましたが、変わりませんでした。 こういうことってあるのでしょうか? 文字化けしないなら、mb_convert_encoding関数を使わなくて良いので、楽だと思いましたが・・・ 何かの不具合なら、いざ完成した時、またmb_convert_encoding関数をいれる手間がありますし、どうしようか迷っています。 本には、「文字化けしない場合もある」という記述は一言も書いてありませんでした。 逆に、「文字化けするからmb_convert_encoding関数を用いる」と大きく書いてあるぐらいです。 何かの設定なのでしょうか? ソフトのバージョンも、同じでした。不思議です。

    • ベストアンサー
    • PHP
  • phpのmb_convert_encodingで文字化け

    phpのmb_convert_encodingで文字化け phpでmb_convert_encodingを使用してSJISよりUTF-8にエンコーディングしています。 ところが、“(”や“?”などが1文字目に存在すると文字化けしてしまいます。 どのような原因が考えられますでしょうか? お願いいたします。

    • ベストアンサー
    • PHP
  • PHP+Postgres 「髙」が文字化け

    DB上に格納した文字列を取得し、PHPで出力すると、 「髙」(はしごだか)等、一部の文字が「□・」のような見た目に化けてしまいます。 環境は以下です。 Linux(CentOS 5) PHP 5.1.6 Apache 2.2.3 PostgreSQL 8.4.3 文字コードは以下です。 Postgres:EUC-JP PHPソース:EUC php.ini の[mbstring]はコメントのまま変更していません。 文字コードの変換を試してみたのですが、「髙」としては出力できませんでした。 Windows上では「CP51932」に変換すると正常に出力できましたが、Linux上ではやはり駄目でした。 mb_language("uni"); mb_internal_encoding("euc-jp"); mb_http_input("auto"); mb_http_output("euc-jp"); $str = "髙橋"; print(mb_convert_encoding($str, "EUCJP-win")); print(mb_convert_encoding($str, "EUCJP-win","EUC-JP")); print(mb_convert_encoding($str, "SJIS")); print(mb_convert_encoding($str, "SJIS","EUC-JP")); print(mb_convert_encoding($str, "SJIS-win")); print(mb_convert_encoding($str, "SJIS-win","EUC-JP")); print(mb_convert_encoding($str, "UTF-8")); print(mb_convert_encoding($str, "UTF-8","EUC-JP")); print(mb_convert_encoding($str, "EUC","SJIS")); print(mb_convert_encoding($str, "Unicode")); print(mb_convert_encoding($str, "Unicode","EUC-JP")); print(mb_convert_encoding($str, "UTF-8", "sjis-win")); print(mb_convert_encoding($str, "CP51932")); print(mb_convert_encoding($str, "MS932")); print(mb_convert_encoding($str, "MS932","EUC-JP")); print(mb_convert_encoding($str, "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win" ), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win","EUC-JP"), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "EUCJP-win","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "EUCJP-win","SJIS-win")); http://blog.livedoor.jp/loopus/archives/50160285.html 上記サイトによると、解決法は「EUC-JPで出力しないこと」という事でしたが、 文字コードを変換して出力できるような事を書いているサイトもあり、結論が出せずにいます。 ソースを書き換えるのは避けたいのですが、いい方法がありましたらご教示ください。

    • ベストアンサー
    • PHP
  • 空メールサービスの自動返信機能プログラム内でmb_convert_encodingが動作しない

    はじめまして。SOGURINと申します。 こちらでの質問は初めてですので何卒宜しくお願いします。 いろいろ調べましたが、解決策が見つからなかったので、ご質問させてください。 【現象】 空メール受信でPHP起動し、送信者に対して自動返信メールを送るプログラムを組んでいます。 /etc/aliasesに起動するphpのファイル名を設定してプログラムを起動する所までは順調です。 返信内容の別ファイル(SJISで保存)からタイトルと本文を読み込んで、 送信前にタイトルをJIS変換させる記述を入れると、プログラムがこの記述で止まってしまいます(おそらく)。 $title = mb_convert_encoding($title,"JIS","SJIS"); ※(おそらく)と言うのは。。 エラーログを出そうとしてもエラーログ出力されないので、多分そうだろうと言う事です。 if(!$title = mb_convert_encoding($title,"JIS","SJIS")){ $output = "関数エラー"; log_up($output,$LOGFILE); exit; } 確実に言えるのは、上記で、 $titleのmb_convert_encodingの記述を外してそのまま送ると、文字化けしたメールが届く。 mb_convert_encodingの記述を入れると、メールは届かない と言う事です。 これまでに似たような話題はありましたが、 ・mb_stringを入れてコンパイルしないといけない点に関しては、phpinfo()で、 「'--enable-mbstring'」とありましたのでインストールされているのか。と。。 ・他のプログラムで画面上で操作して、mb_convert_encodingでJIS変換⇒メール送信 という機能は使ってますが普通に動いてます。 ということで、サーバーとしてmb_convert_encodingが動かない環境と言うわけでは無いと思うのですが、通常起動の時はmb_convert_encodingが正常に動作して、 自動起動の時だけmb_convert_encodingでプログラムが止まってしまう事に関して、他に原因として考えられることがありますでしょうか?

    • 締切済み
    • PHP
  • MySQLでの文字化けについて

    すいません、教えてください。 PHP(PHP-5.2.4)でCSVファイル を読み込んでMySQL(4.1.22)に INSERTしているのですが文字化けします。 SJIS→utf8_general_ciです。 いろいろ調べて ~ $wk[$i] =mb_convert_encoding($csvfile[$i],'UTF-8','SJIS-win'); ~ とかやってみたのですがうまくいきません。 どなたかよろしくお願いします。

    • 締切済み
    • PHP
  • PHPで変数の文字コードをまとめて変えたい

    初めまして、 PHPで変数 $a1から$a100 に入っている文字コードをまとめて変更したいのですが可能でしょうか? $a1 = mb_convert_encoding($a1, "SJIS", "auto"); $a2 = mb_convert_encoding($a2, "SJIS", "auto"); 上記のように$a1から$a100まで入力するしかないのでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう