PHP OPENファイル(書き込み)をファンクション化したい

このQ&Aのポイント
  • PHPのファイルをオープンして書き込むための関数を作成したいと思います。
  • POSTメソッドで受け取ったデータを曜日と時間に分けてクーロンファイルに書き込む処理を実装したいです。
  • 曜日と時間の情報をフォームから受け取り、クーロンファイルに設定するための処理を作成します。
回答を見る
  • ベストアンサー

PHP

OPENファイル(書き込み)をファンクション化したい。どうしたらいいでしょうか? <?php ///////////////////////////////////////////////////////////////////// //定数 ///////////////////////////////////////////////////////////////////// //クーロンのパス $path = '/etc/cron.d/auto_pbxrestart'; ///////////////////////////////////////////////////////////////////// //クーロンの設定の書き込み ///////////////////////////////////////////////////////////////////// if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 曜日を1,2,4,5とカンマをはさむ $selectday = $_POST['day']; foreach($selectday as $day){ $day2=$day2.$day. ","; } // 最後はカンマをはずす $day3 = rtrim($day2, ","); if ($day3 == ""){ $yday3="*"; } // クーロンファイルに書き込む $fpt = fopen($path, 'w'); if ($fpt == false) { print "このファイルには書き込みできません。<br>\n"; } //実際にクーロンに書き込みする(「* *」は月日なので今回は設定対象にならない) fwrite($fpt, $_POST['opt'] .$_POST['nminute']. " " .$_POST['nhour']. " * * " .$day3. " root /usr/local/sbin/auto_pbxrestart.pl"); fclose($fpt);

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
回答No.2

<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $option = $_POST['opt']; $selectday = $_POST['day']; $nminute = $_POST['nminute']; $nhour = $_POST['nhour']; // 不正な値が登録されていないかのバリデーションなりサニタイズを行ってください。 // とりあえず英数字とハイフン、アンダーバー以外削除 $option = preg_replace('/^[^a-z0-9_-]+$/i', '', $option); // selectdayは配列でないなら不正なのでとりあえずアプリ落とす if (is_array($selectday)) { exit; } // 渡されてきた値が文字列'0'から'6'の間以外全部削除する $selectday = array_filter($selectday, function ($day) { return in_array($day, ['0', '1', '2', '3', '4', '5', '6'], true); }); if (!is_numeric($nminute) || !is_numeric($nhour)) { // 数値以外が渡されてきているようならアプリを落とす exit; } try { // 書き込み処理 rewrite_cron_for_pbxrestart($option, $selectday, $nminute, $nhour); } catch (Exception $e) { echo $e->getMessage(); exit; } } /** * auto_pbxrestartにcronのスケジュールを書き込む関数 * * @param string $option * @param array $selectday * @param string $nminute * @param string $nhour * @return void */ function rewrite_cron_for_pbxrestart($option, $selectday, $nminute, $nhour) { // 汎用的な関数でもないので定数/グローバル変数などとせずスコープを限定してしまった方が安全 $path = '/etc/cron.d/auto_pbxrestart'; $fp = fopen($path, 'w'); if (!$fp) { throw new Exception("'{$path}' が開けませんでした"); } // ファイルの書き込み前にロックする if (!flock($fp, LOCK_EX)) { throw new Exception("'{$path}' がロックできませんでした"); } // 選択した曜日を結合 $days = implode(',', $selectday); if ($days === '') { $days = '*'; } // 書き込みしたい行を作成 $line = sprintf('%s%s %s * * %s %s %s', $option, $nminute, $nhour, $days, 'root', '/usr/local/sbin/auto_pbxrestart.pl'); // 書き込み if (!fwrite($fp, $line)) { throw new Exception("'{$path}' に書き込みができませんでした"); } fclose($fp); } ?> 回答No.1でもいただいているように、パーミッションの解決とかは適時考える必要があります。 また、システムに影響を与えるスクリプトですから外部からの攻撃が怖いところなので、安全策は慎重に行ってください。

akio123
質問者

お礼

ありがとうございます^^

その他の回答 (1)

  • _kappe_
  • ベストアンサー率68% (1523/2217)
回答No.1

質問文とコードを見ても、何をしたいのかがよく分かりません。 ・「OPENファイル(書き込み)をファンクション化したい」とありますが、ファンクション(関数)化したい部分を function 関数名(引数リスト) {  関数の中身 } のように囲えばいいだけです。 関数名はこの場合であれば例えばwrite_to_cron_fileのように、何をする関数なのかが分かりやすいものにします。引数にしたいものがなければ、引数リストは無しでも構いません。 ・$yday3="*";の部分、他の部分でこの変数名は使われていないので$day3の書き間違いと思われます。 ・$fpt = fopen($path, 'w');の部分、'w'モードでファイルの書き込みをする場合、元のファイルの内容は一度全て消えますが、それで意図通りですか。 ・fopenに失敗した場合にもその後のfwrite,fcloseを実行しようとしてしまいます。if ($fpt == false) { 略 }の後ろの部分はelseブロックに入れるべきでしょう。 ・このPHPプログラムはroot権限で実行するつもりなのでしょうか。/etc/cron.d/以下のファイルはroot以外のユーザーは書き換えることができないようになっているのが普通です。

akio123
質問者

お礼

ありがとうございます^^

関連するQ&A

  • PHP

    PHPでFunctionで配列の渡し方が間違っています。$arr['opt']などの書き方をどうやって変えればいいですか? $arr = array( 'opt' => $_POST['opt'], 'nminute' => $_POST['nminute'], 'nhour' => $_POST['nhour'], 'days' => $days ); function OpenWrite($arr){ /* クーロンのパス */ $path = '/etc/cron.d/auto_pbxrestart'; try{ /* クーロンファイルに書き込む */ $fpt = fopen($path , 'w'); if ($fpt == false) { $message = "このファイルには書き込みできません。<br>\n"; } /* 実際にクーロンに書き込みする(「* *」は月日なので今回は設定対象にならない)*/ $cron_config = $arr['opt'] . $arr['nminute'] . " " . $arr['nhour'] . " * * " .$arr['days'] . " root /usr/local/sbin/auto_pbxrestart.pl"; fwrite($fpt , $cron_config); fclose($fpt); return $message; }catch (Exception $e){ echo "例外処理が発生しました"; } }

    • ベストアンサー
    • PHP
  • PHP

    PHPで書き込みができません。なぜでしょうか? <?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $erandayoubi = $_POST['youbi']; foreach($erandayoubi as $youbi){ $youbi2=$youbi2.$youbi. ','; } $youbi3 = rtrim($youbi2, ","); $fp = fopen("/etc/cron.d/autopbxrestart", "w"); fwrite($fp, $_POST['opt'] .$_POST['fun']. " " .$_POST['jikan']. " * * " .$youbi3. " root /usr/local/sbin/auto_pbxrestart.pl"); fclose($fp); } ?>

    • ベストアンサー
    • PHP
  • PHP

    <?php $tmpfname = tempnam("/var/tmp", "auto_pbxrestart"); $cmd = "/usr/bin/sudo chown 777 ".TEMP_PATH; exec($cmd, $output, $return); $cmd = "/usr/bin/sudo chown apache::apache ".TEMP_PATH: exec($cmd, $output, $return); $handle = fopen($tmpfname, "w") if ($handle == false) { $status = '01'; print "debug02err"; } /* 実際にクーロンに書き込みする(「* *」は月日なので今回は設定対象にならない)* $cron_config = $arr['opt'] . $arr['nminute'] . " " . $arr['nhour'] . " * * " .$arr['days'] . " root /usr/local/sbin/auto_pbxrestart.pl"; fwrite($fpt , $cron_config); fclose($fpt); /* テンポラリのクーロンの設定をして本番のクーロンに設定をする */ print "debug04=".$cmd.":".$return."<br>"; $cmd = "/usr/bin/sudo cp -f " . CRON_DAILY_ESTAB . " " . CRON_DAILY_ESTAB . ".bak"; exec($cmd, $output, $return); $cmd = "/usr/bin/sudo cp -f " . TEMP_PATH . " " . CRON_DAILY_ESTAB; exec($cmd, $output, $return); unlink($tmpfname); print "debug05 = ".$cmd.":".$return."<br>"; /* 正常終了 */ ?>

    • ベストアンサー
    • PHP
  • 【PHP】書き込みできません

    PHP5.3の環境でファイル書き込みのロジックがうまくいかずに困っています。 環境は下記の通りです。 Apache 2.2.2 PHP 5.3.3 コードは下記の通りです。 >>CODE $file_path = "/home/xxxxx/logs/test.txt"; echo file_exists($file_path); echo "file_path1=".$file_path; if ( file_exists($file_path) ) { echo "file_path2=".$file_path; // ファイルポインタ取得 if ( ($fp = fopen($file_path, 'a')) !== FALSE ) { // ログは追記 echo "file_path3=".$file_path; // ファイルポインタに書き込み fwrite($fp, $date."\n"); fwrite($fp, $body); fwrite($fp, "----------------------------------------------------\n"); // ファイルポインタクローズ fclose($fp); $flg = true; } } <<CODE 権限は下記の通りです。 logs 777 test.txt 777 現象は下記の通りです。 echo文のfile_path1は表示されます。 echo文のfile_path2及びfile_path3は表示されません。 $file_path="/home/logs/test.txt";に変更すると、 echo文のfile_path1及びfile_path2が表示されます。 echo文のfile_path3は表示されません。 ファイルが存在することはlsで確認したので間違いありません。 権限も777にしているので、何がおかしいのか困り果ててしまい、初めて投稿させて頂きました。 PHPやApacheの設定ファイル等も問題あるのでしょうか。 どうぞご指摘お願いいたします。

  • phpからサーバー上のcronにジョブ登録したい

    プログラミング初心者です。 【ウェブブラウザでphpファイルを開くと、レンタルサーバーのcronにジョブ登録される】ようにしたいのですが、上手く行きません。 下記記述に不備はありますでしょうか? <?php $cron = popen("/usr/bin/crontab -", "w"); $line = "51 22 13 11 * /usr/bin/php /home/userid/public_html/絶対パスでファイルの場所/ファイル.php"; fwrite($cron, $line); pclose($cron); ?> ※テストとして 11/13 22:51 に実行するような記述をしていました。 諸々検索もしたのですが、レンタルサーバー上にphpでジョブ登録するような事例がなく… お力添えください。宜しくお願い致します。

    • 締切済み
    • PHP
  • PHP

    PHPで下のPHPが読み込まれません。なぜでしょうか? <?php: $result = array(); $path = '/etc/cron.d/autopbxrestart'; $handle = fopen($path, 'r'); while(false !== ($line = fgets($handle))){ list($fun, $jikan, $hi, $tuki,$youbi) = explode(' ', $line); $result{0} = $fun; $result{1} = $jikan; $result{2} = $hi; $result{3} = $tuki; $result[4] = $youbi; echo $result{0}; echo $result{1}; echo $result{2}; echo $result[3]; echo $result[4]; fclose($handle); } ?> <php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $erandayoubi = $_POST['youbi']; foreach($erandayoubi as $youbi){ echo ' '. $youbi. '曜日 '; } echo $_POST['jikan']. "jikan".POST['fun']. "分 実行有無:[".$_POST['opt']. "]を設定しました。"; ?>

    • ベストアンサー
    • PHP
  • 続・指定した時間にPHPプログラムを実施

    お世話になります。 http://oshiete1.goo.ne.jp/qa3423046.html にて質問させて頂いたのですが、追加で以下の質問をさせて頂きたく思います。ぼやけた質問ですので、こういう感じでどうでしょうというアドバイスでも頂ければ幸いでございます。 で、前回アドバイスいただきました事項を参考にさせて頂いて、 DBにて各情報を管理して、メール送信のプログラムはPHPをCRONにて動作させようと考えました。 ・メール関連DBテーブル  -> IDを一意の値として管理する。 postgres=# select * from mail_gen; id | seireki | tuki | nitiji | jikan | word1 | ----+---------+------+--------+-------+-----------------+ 31 | 2008 | 01 | 01 | 00 | メール内容 | id | integer | not null default nextval また、HTMLからメール関数の変数を引き継いだ際に、DBでデータ挿入以外にも、日時データをテキストファイルで追加するようにして、 <? require('../include/init.inc'); $seireki = $_POST{'seireki'}; $tuki = $_POST{'tuki'}; $nitiji = $_POST{'nitiji'}; $jikan = $_POST{'jikan'}; $word1 = $_POST{'word1'}; $sql = "insert into mail_generator (seireki,tuki,nitiji,jikan,word1,word2,word3) values ('$seireki','$tuki','$nitiji','$jikan','$word1');"; pg_query("$sql"); $fhn = fopen("./at.txt","a"); fwrite($fhn,$seireki); fwrite($fhn,"-"); fwrite($fhn,$tuki); fwrite($fhn,"-"); fwrite($fhn,$nitiji); fwrite($fhn," "); fwrite($fhn,$jikan); fwrite($fhn,":00"); fwrite($fhn,"\n"); fclose($fhn); ?> ご教示頂いたことを参考にして、at.txtで時間が一致した時に、 指定したメール送信関数を起動させようと思ったのですが、 $now = date("Y-m-d H:i"); $atfile = "at.txt"; $atarr = file($atfile);  if(count($atarr)>0){   foreach($atarr as $at){    if($at == $now) mySendMail();   }  } ・at.time # more attime.txt 2008-01-01 00:00 2008-01-01 00:00 メール送信されるトリガーで、日時の条件だけでは条件として一意ではないため、IDと一致する条件も加えたいと考えております。 なにかうまい?方法はないでしょうか。

    • ベストアンサー
    • PHP
  • phpプログラミングについて

    php初心者です。 ファイルをダウンロードして保存するプログラムを作成しています。 ダイアログを表示させる形式をとっているのですが、保存されたファイルが正しく開けないんです。 ワードの場合だとファイルが壊れ、テキストファイルの場合、htmlのコードが一緒に入ってしまいます。 以下にソースコードと、ファイルの表示結果も載せるので、アドバイスお願いします。 [download.php] <html> <head> <meta http-equiv = "Content-Type" content = "text/html; charset = UTF-8"> <title>testdownload</title> </head> <body> テキストリンクの場合<br> <a href = "sample.php">sampleファイルをダウンロードする</a> <br><br> フォームボタンの場合<br> <form method = "post" action = "sample.php"><input type = "submit" value = "download"></form> </body> </html> [sample.php] <html> <head> <meta http-equiv = "Content-Type" content = "text/html; charset = UTF-8"> <title>downloadphp</title> </head> <body> <?php $path_file = "./test2.txt"; $path_file = mb_convert_encoding($path_file,"Shift_JIS","AUTO"); /* ファイルの存在確認 */ if (!file_exists($path_file)) { die("Error: File(".$path_file.") does not exist"); } /* オープンできるか確認 */ if (!($fp = fopen($path_file, "r"))) { die("Error: Cannot open the file(".$path_file.")"); } fclose($fp); /* ファイルサイズの確認 */ if (($content_length = filesize($path_file)) == 0) { die("Error: File size is 0.(".$path_file.")"); } /* ダウンロード用のHTTPヘッダ送信 */ header("Content-Disposition: attachment; filename=\"".basename($path_file)."\""); header("Content-Length: ".$content_length); header("Content-Type: application/octet-stream"); /* ファイルを読んで出力 */ if (!readfile($path_file)) { die("Cannot read the file(".$path_file.")"); } ?> </body> </html> [test2.txt] これはテストです。 [ダウンロード後のtest2.txt] <html> <head> <meta http-equiv = "Content-Type" content = "text/html; charset = UTF-8"> <title>downloadphp</title> </head> <body> これはテストです。 </body> </html> 以上、よろしくお願いします。

    • 締切済み
    • PHP
  • PHPのファイル操作

    テキストボックスの値をPOSTで送信し、日時とユーザが入力した値を1行ずつファイル(review.txt)に保存し、ページ下部にファイル内容を1行ずつ表示するプログラムを作成しましたが、ブラウザに発言履歴が残りません。どの部分を修正すればいいですか? <?php //ブラウザに履歴がのこらないです $filename = './review.txt'; $comment = ''; $date = date('m/d H:i:s'); if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_POST['comment']) === TRUE) { $comment = $_POST['comment']; } if (($fp = fopen($filename, 'a')) !== FALSE) { $result = fwrite($fp, $comment . '-' . $date . "\n"); if ($result === FALSE) { print 'ファイル書き込み失敗: ' . $filename; } fclose($fp); } } $work = []; if (is_readable($filename) === TRUE) { print "\n"; if(($fp=fopen($filename,'a')) !== FALSE) { print "\n";} while(($tmp = fgets($fp)) !==FALSE) { print "\n"; $work[] = htmlspecialchars($tmp,ENT_QUOTES,'UTF-8'); } fclose($fp); } else { print "\n"; $work[] = 'ファイルがありません'; } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <h1>ファイル操作</h1> <form method="post" > <label><p>発言:<input type="text" name="comment"><input type="submit" value="送信"></p></label> </form> <p>発言一覧</p> <?php foreach ($work as $value){?> <p><?php print $date; $value?></p> <?php } ?> </body> </html>

    • ベストアンサー
    • PHP
  • RGB→YUV変換のプログラム

    RGB→YUV変換を行っているのですが、 うまくいきません。 以下であっているのでしょうか? //RGB > YUV変換 void RGBtoYUV(char *filename,int width,int height) { FILE *fpt,*fpt_output; unsigned char *Input,*head; unsigned char Y=0,U=0,V=0; int i,j,b_flag=1; int modification=0; modification=width%4; //ファイルのオープン fopen_s(&fpt,filename,"rb"); if(fpt==NULL) { char DebugStr[256]; wsprintf(DebugStr,"%sが存在しません",filename); MessageBox(NULL,DebugStr,"File Error",MB_OK); } else { fopen_s(&fpt_output,"YUV.bmp","wb"); //ヘッダ情報の書き込み head=(unsigned char*)malloc(54); fread(head,sizeof(unsigned char),54,fpt); fwrite(head,sizeof(unsigned char),54,fpt_output); free(head); Input=(unsigned char*)malloc(3*width*height*sizeof(unsigned char)); //メモリに展開 for(i=0;i<height;i++) { fread(&Input[i*(3*width)],sizeof(unsigned char),3*width,fpt); fseek(fpt,modification,SEEK_CUR); } fclose(fpt);//Inputファイルのクローズ for(i=0;i<3*width*height;i+=3*width) { for(j=0;j<3*width;j+=3) { Y=(unsigned char)(0.299*Input[i+j+2]+0.587*Input[i+j+1]+0.114*Input[i+j]); U=(unsigned char)(-0.169*Input[i+j+2]-0.3316*Input[i+j+1]+0.500*Input[i+j]); V=(unsigned char)(0.500*Input[i+j+2]-0.4186*Input[i+j+1]-0.0813*Input[i+j]); //Y if(Y<0) { Input[i+j]=0x00; } else if(Y>255) { Input[i+j]=0xff; } else { Input[i+j]=Y; } //U if(U<0) { Input[i+j+1]=0x00; } else if(U>255) { Input[i+j+1]=0xff; } else { Input[i+j+1]=U; } //V if(V<0) { Input[i+j+2]=0x00; } else if(V>255) { Input[i+j+2]=0xff; } else { Input[i+j+2]=V; } } }//i fseek(fpt_output,54,SEEK_SET); for(i=0;i<height;i++) { fwrite(&Input[3*width*i],sizeof(unsigned char),3*width,fpt_output); //修正値の代入 for(j=0;j<modification;j++) { fwrite("\x000",sizeof(unsigned char),1,fpt_output); } } fclose(fpt_output); free(Input); } } 又 YUV→RGBにすると元の画像に戻らずに困っています。 プログラムに対するご指摘お願いします。 このプログラムはWindowGUIで幅と高さとファイル名を入力して 走らせるプログラムです。24bpp BMPが対象です。