• ベストアンサー

Cronでのカレントディレクトリについて

3日前からVine Linuxを初めてインストールしまして、 自宅サーバをやろうとしている、初心者です。 これまではxrea.comのレンタルスペースを借りてphpでコンテンツを作っていました。 phpをCronを使って、定期的実行する際に [シェルファイル] #!/bin/sh #PHP /usr/bin/php /var/www/html/filename.php exit のようにしてファイル操作をするphpを実行させたのですが [filename.php] <?php $fp=fopen("../data/dat.txt","w"); fputs($fp,$data); fclose($fp); ?> で実行したところURLからは問題なく dat.txt の内容を編集することができるのですが cronからだと PHP Warning: fopen(../data/data.txt): failed to open stream: No such file or directory となります。 そこでカレントディレクトリを調べると /root/PHPs/ となっていたので、そのようなエラーになっていました (1)カレントディレクトリを変更するコードを毎回phpに組み込む (2)フルパスでファイルを指定する ことでこのトラブルは回避されるのですが、 xrea.comでは、相対パス、カレントディレクトリを毎回指定しなくても、実行できていました。 cronでphpを実行する際に、phpが存在するディレクトリへ 自動でカレントディレクトリを移動するようにしたいです。 そのような方法があれば、教えてくください。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

たとえばこんな感じ? <?php $path=realpath(dirname( __FILE__)); $filename="../data/dat.txt"; $filename=$path."/".$filename; $fp=fopen($filename,"w"); fputs($fp,$data); fclose($fp); ?>

widoww
質問者

お礼

はじめての質問の書き込みでしたので、返事がくるか不安でした。 お返事を頂きありがとうございます。 上のソースでうまくいきました。 ありがとうございます。^^ また、このようなコードを打たないで なんというか、自動的にphpを実行する際にカレントディレクトリを帰られるものがないのかなぁとおもっています。 えと、つまり、phpに記述しなくても、 PCのほうでphpを実行する際に、カレントディレクトリを自動で プログラムの存在する位置に移動させる設定(cron側での設定?)みたいなものがあるんじゃないだろうかと思っています。 ご存知でしたら、ご教示いただきたいです。 よろしくお願いいたします。

その他の回答 (2)

noname#39970
noname#39970
回答No.3

>プログラムを実行する際に だからシェル側でやったら? 有るんだし /usr/bin/php /var/​www/html/filename.php​ ↓ (飽くまでも参考ね) cd /var/www/html /usr/bin/php ./filename.php

widoww
質問者

お礼

ありがとうございます。 よく、わからなかったのですが、調べたところ PHPのCLI版だとカレントディレクトリが自動で移動しないようなので、自分が求めていることをやろうとするとCGI版を導入する必要があるのかな?と勝手に想像してます。

noname#39970
noname#39970
回答No.2

シェル側で cd で必ず作業場所に移動させたら?

widoww
質問者

お礼

お返事ありがとうございます。^^ 初心者なので、見当違いなことをいっているのかもしれませんが、 cdで一回一回移動させるのは大変なきがしまして;; プログラムを実行する際に、作業(実行)場所に自動で移動するような(cron側とかOSサイド)設定はないのでしょうか? それっぽいキーワードで WEBで検索をかけてみたのですが、みつからなくて、 そのような設定やあるいは同等な機能を果たすようにする方法? は存在しないのでしょうか?

関連するQ&A

  • 【Mac/Xcode】カレントディレクトリのファイルの読み込みについて

    Xcode(C++)で、設定ファイル(test.txt)を読み込むプログラムを作成しています。 困っているのは、できあがった実行ファイル(test.app)と同じディレクトリにその設定ファイルを置いて、test.appをダブルクリックで実行しても、設定ファイルを読み込めないでいます。(VC++ではできたのですが) もちろん、明示的にtest.txtのパスを下記のソースで指定すれば読み込めます。実行する場所が毎回決まっていないので、カレントディレクトリ内のファイルが読み込めるようにしたいです。 ソースは以下のように書いてます。 Xcode側で何か設定とかがあるのでしょうか? どなたかご存知の方がいらっしゃいましたらご教授のほどよろしくお願いいたします。 ※test.appの場所は、"プロジェクト名/build/Debug/test.app" です。 -------------------------------------------- void main(){ FILE* fp; char s[256];  char *filename = "test.txt"; fp = fopen(filename, "r"); if( ! fp){ printf("ファイルオープン失敗"); // ここに入る return;  } while (fgets(s, 256, fp) != NULL) { // test.txt を読み込む処理 (中略) } (中略) }

  • ExcelVBAでカレントディレクトリのファイルを開く方法は?

    ExcelVBAでファイルを開くとき、 Workbooks.OpenText Filename:="D:\DataDir\TestFile.txt" とフルパスを指定すれはファイルを開けますが、パス指定なしでカレントディレクトリ(VBAを起動したExcelファイルがあるディレクトリ)のファイルを開くためにはどうしたらいいんでしょうか? 教えてください。ちなみにExcel2000を使っています。

  • さくらサーバーのcronでphpを動かしてファイルを作りたい。

    さくらサーバーのcronでphpを動かしてファイルを作りたい。 cron.php <?php $date = date("Y/m/d H:i:s"); $fp = fopen("./cron.txt", "w"); flock($fp, LOCK_EX); fputs($fp,$date); fclose($fp); print "cron成功"; ?> cron報告レポートには[cron成功]の文字が出ているので、cronコマンドは間違っていないのですが、cron.txtが作れていません。 直接、cron.phpにアクセスすると、[cron成功]と文字が出てcron.txtも作れています。 どうすればcron.txtが作れるのでしょうか。 よろしくお願いします。

  • ショートカットで起動した場合のカレントディレクトリ

    実行ファイルのあるディレクトリに結果を出力するCで書いたプログラムがあります。 この実行ファイルのショートカットを作り、それを起動したところ、結果が手元ではなく、実行ファイルのあるディレクトリに作成されてしまい困っています。 ショートカットをおいたディレクトリに出力するようにするにはどうやったらよいのでしょうか? 実行ファイルのソースリストはありますので、実行ファイルの修正も可能です。 ソースリストを見たところ、結果を出力するファイルは、  fp = fopen("temp.txt", "w"); でファイルをオープンしていました。 なお、実行環境は、WinXPです。 よろしくお願いします。

  • ロリポップでOPENPNE(pseudo cron)

    ロリポップでOPENPNE(2.14)を運営しています。 ロリポップはcronが使えないので 擬似cronとしてpseudo-cronを利用しています。 そこで質問なのですが、 動くファイルと動かないファイルがあるようで 運営開始以降ずーっと困っております。 動かしたいファイルは「tool_send_daily_news(デイリーニュース)」 ---------------------------- 00 9 * * * bin/tool_send_daily_news.cron 00 9 * * * bin/tool_send_daily_news.php ---------------------------- 共にダメです。 ログを見ると、指定どおりの時間にきちんと Running とCompletedを繰り返しているようです>< tool_send_daily_news.php をブラウザで直接叩くと送信はできるのですが cronで動かしたいのです。 また、OPENPNE内でオリジナルのスクリプトを作りました。 (とあるファイルを生成する) cron関係なので、bin/○○.phpとして置いて これもまた定期的に動かしたいのですが動きません・・・。 (ファイルが生成されていない) デイリーと同様にRunning とCompletedを繰り返しています。 ---------------------------- 00 9 * * * bin/○○.cron 00 9 * * * bin/○○.php ---------------------------- こちらもまた、ブラウザで直接実行するときちんとした動作が確認できます。 (ファイルが生成される) パーミッション、ディレクトリに問題はないと思います。 また、相対パスで動作しているファイルがあるので、絶対パスにはしていません。 これ以外に何か問題がありそうな指摘をお願い致します。 cronファイルの中身はどのファイルも形式は共通で ---------------------------- #! /bin/sh cd $1 $2 -f ○○.php ---------------------------- です。 PS: そもそも・・・なのですが、pseudo cronはcronファイルを経由せず、直接PHPファイルを実行する事は本当に出来ますでしょうか!? (検索すると、動作している方がいらっしゃる) 出来ない場合、cronファイルにはどのように書けばよいのでしょうか。 宜しくお願い致します。

    • 締切済み
    • PHP
  • ディレクトリの作り方について

    初心者の者です。 プログラムでディレクトリ(フォルダ)の作り方をご存知の方教えてください。 fopen("data/○○.dat", "w")で、 dataというディレクトリ(フォルダ)の中に○○.datというファイルを 作ることができるという事は分かったのですが、この方法では あらかじめdataというディレクトリを作らなければなりません。 プログラムを実行させるときにディレクトリを作り、その中にファイルを 作るにはどのようにすればよいでしょうか? また、動作環境はWindowsとUNIXの両方で使いたいのですが, 使い分けなければならないのでしょうか? よろしくお願いします。

  • fedora11でのcron設定

    fedora11,apache,php5の環境でcronを使いたいのですが、動きません。。 状況が、 fedora11 php5 apache を使用していて、cronを使ってphpの定期実行を行いたいのですが、どうしてもうまくいきません。 かなりググってはみたのですが、liuxについては初心者なので、どうにもわかりません。 設定内容が、 /etc/crontabが、 SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ * /1 * * * * apache /usr/bin/php /var/www/html/cron.php で、/var/log/cron でログを確認したところ Jul 28 19:00:01 host CROND[8417]: (apache) CMD (/usr/bin/php /var/www/html/cron.php) となっていてこれが一分ごとに出てきます。 cron.phpにはファイル追記の処理を書いてあります。 エラーではないようなのですが、ファイル操作が行われていないようなので動いていないようなのです。 ローカルホストでphpを実行したらちゃんと動くのでphp内のミスではないようです。 パーミッション関係だったらログにエラーが出そうなものですし、、、。困っています。。 どなたかお知恵を貸していただけませんでしょうか、よろしくお願いします。

  • 【UNIX】unzip がcron で作動しない

    さくらインターネットのCRON機能で cd (対象ディレクトリ); /usr/local/bin/php -f (phpの名前)コマンドで PHPを自動的に実行しています。 その PHPには system("cd /zipファイルのあるパス/; unzip -Z hoge.zip"); というコマンドが実行されるようになっています。 (本来は、zipの解凍をしたいのですがテスト的にまず、ファイルの内容を表示) このphpを直接ブラウザ上で実行する場合は、うまく動くのですが CRON上で動かした場合は、unzip: not found というエラーが帰ってきます。 また、CRONのコマンド実行フォームにphp実行コマンドではなく、直接 "cd /zipファイルのあるパス/; unzip -Z hoge.zip" を実行しても unzip: not found が出てきてしまいます。 /home/[ユーザー名]/www/・・・と 絶対パスを指定しているので、パスは合っているかと思います。 unzip コマンドを実行するには予め何かを実行しないといけないのでしょうか? 何故、unzip: not found が出てしまうのか アドバイスよろしくお願いいたします。 サーバーOSバージョン FreeBSD 7.1-RELEASE-p16 i386

  • PHPをバージョンアップしたらCRONが動かない

    CentOSとPHPをバージョンアップしたら、CRONだけが動かなくなってしまいました。 PATH関係が変わったことが問題のような検討がつくのですが、いろいろ試してもうまくいきません。どのように解決したら良いか教えていただければと思います。 [バージョンアップ内容] CentOSを5.3から5.7にバージョンアップ PHPを5.1.6から5.3.3にバージョンアップ phpMyAdmin3.4.8をインストール MySQL 5.0.77(バージョンアップせず) バージョンアップ前には ・PHPからMySQLにデータを登録するプログラムは動作していた。(ウェブサイト形式で動作確認) ・上記のプログラムはCRONで動いていた。(CRONでも動作確認) PHP5.1.6の時はCRONに下記のように登録していました。 10 * * * * /usr/bin/php /var/cron_file/test_cron.php アップデート後にウェブサイト形式でプログラムが動くことを確認しました(ページを開くと下記のプログラムが動作し、データをMySQLに登録) phpMyAdminも問題なく動きます。 CRONの問題点を探し出すために下記のことを行いました。 CRONのステータスを確認 # /etc/rc.d/init.d/crond status crond (pid 32151) を実行中... CRONをリスタート # /etc/init.d/crond restart crond を停止中: [ OK ] crond を起動中: CRONのエラーの確認 # vi /var/log/cron PHPの場所の確認 # find / -name php /usr/share/php /usr/include/php /usr/bin/php /usr/lib64/php /var/lib/php どれがPHPの場所なのかがわからないので、とりあえず5.1.6の時に指定していた「/usr/bin/php」を採用 このあたりはネットで情報を探して、登録してみたので正しいのかどうかよくわかりません。↓ PATHの記入 (その1) # vi /root/.bash_profile PATH=$PATH:/sbin:/usr/sbin:/bin:/usr/bin export PATH (その2) #vi /etc/profile PATH=$PATH:/sbin:/usr/sbin:/bin:/usr/bin export PATH PATHの確認 # env | grep PATH PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/php (上記以外にもいろいろいじっていたら、このようになってしまいました。上記以外のところでどこで設定したかがわからないので、PATHを消す方法も教えていただければと思います) 「/usr/kerberos/sbin:/usr/kerberos/bin」はもともとシステムで登録されていたもので、上記で登録した「/sbin:/usr/sbin:/bin:/usr/bin」以外のもの「/usr/bin/php」などはどこで登録したかわからなくなってしまったものです。 CRONでPATHを指定する部分でPHPのバージョンによりPATHの値が異なるという情報を見つける /usr/bin/php /usr/bin/php5 /usr/bin/php53 各パターンで 「10 * * * * /usr/bin/●● /var/cron_file/test_cron.php」 をcrontab -eに登録してエラーを見てみる。 (1)「*/1 * * * * /usr/bin/php /var/cron_file/test_cron.php」 # vi /var/log/cron →エラーに何も表示されない (2)「*/1 * * * * /usr/bin/php5 /var/cron_file/test_cron.php」 → エラーに何も表示されない。 (3)「*/1 * * * * /usr/bin/php53 /var/cron_file/test_cron.php」 →エラーが表示される Dec 16 20:20:01 ドメイン crond[11412]: (root) CMD (/usr/bin/php5 /var/cron_file/test_cron.php) クローン自体は動いていて、エラーがでているような感じは把握できたのですがここで行き詰まりました。 PHPのパス関係か、MySQLのパス関係、PHPとMySQLの連係、そのあたりのどこかが原因なのでしょうか? 参考資料としてphpinfo()の情報を記載します。 Loaded Configuration File  /etc/php.ini PATH /sbin:/usr/sbin:/bin:/usr/bin 参考)プログラムの内容 --------------------------------------------- require_once ('/var/DB接続情報保存ディレクトリ/password.php') try { $dbh = new PDO($DSN , $DBUSER , $DBPASS); $query=<<<EOF INSERT INTO test (name) VALUES (:name) EOF; $stmt = $dbh->prepare($query);    $name='斉藤太郎'; $stmt->bindParam(':name', $name); $stmt->execute(); }//try_end catch(PDOException $e) { print "Error!: " . $e->getMessage() . "<br>"; die(); }//catch_end ---------------------------------------------

    • ベストアンサー
    • PHP
  • BCB  読み込み。

    OpenDialogでバイナリファイルを読み込むのですが、、 同じフォルダに同じファイルネームで形式が違うものを同時に読み込みたかったので。(A.txt A.dat B.txt B.dat....) ///// FILE *fp; if(OpenDialog1->Execute()) {          A1 = ExtractFilePath(OpenDialog1->FileName); A2 = ExtractFileName(OpenDialog1->FileName); A3 = ChangeFileExt(A2,"");        FN1 = A1 + A3 +".dat"; FN2 = A1 + A3 +".txt"; fp = fopen("FN1", "rb" ); fread(Data,2,3000,fp); } ///// FN1とFN2をメモ確認してみたところFN2の方はそのままのファイルの中身が表示されましたが、FN1はそのdatファイルの絶対パスが表示されたので上のようにやってみたのですがうまく読み込めませんでした。 ご指導の方お願いします。