利用規約の変更について

レンタルサーバのSmartyのパーミッションでつまずいています。
とあるAレンタルサーバでsmartyを利用したPHPのプログラムを設置するとなんの問題もなく設置できるのですが

別のBレンタルサーバでsmartyを利用したPHPのプログラムを設置すると以下のようなエラーがでます。
Fatal error: Smarty error: unable to write to $compile_dir '/virtual/xxx/public_html/xxx/templates_c'. Be sure $compile_dir is writable by the web server user. in /virtual/xxx/public_html/xxx/class/Smarty/libs/Smarty.class.php on line 1093

書き込み権限がtemplates_cディレクトリにないということらしいですが、Bレンタルサーバのtemplates_cディレクトリのパーミッションは、0755で、設置が成功したAレンタルサーバのtemplates_cディレクトリのパーミッションも、0755です。

実行しているSmarty.class.phpのパーミッションも、0644で同じです。

同じパーミッションでレンタルサーバごとにエラーが出る出ないが違う理由はなんでしょうか?サーバの設定に詳しくないのでよくわかりません。考えられる原因があれば教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

phpの実行モードはどうなっていますか?AサーバがCGI動作で、Bサーバがモジュール動作なんてオチがありそうなので・・・



モジュール動作ならApacheの権限でしか動作しませんからotherへの書き込み権限が必要です(606とか707とか)。
    • good
    • 0
この回答へのお礼

ヒントを下さりありがとうございます。

補足します。
phpinfo()でServer APIを調べました。
成功するAレンタルサーバは、CGI/FastCGI。
失敗するBレンタルサーバは、Apache。

検索して調べてみたところ、safe_modeという言葉があったので、
phpinfo()でsafe_modeを調べました。
成功するAレンタルサーバは、Off。
失敗するBレンタルサーバは、On。

CGIモードやセーフモードで検索したサイトを見たところどうやらエラー原因にヒットしたようです。糸口が見つかったのでこれから調べてみます。ありがとうございます。助かりました。

お礼日時:2013/11/15 10:12

パーミッションだけ見て、そのディレクトリの所有ユーザーと、phpの実行ユーザーは調べないのでしょうか?

この回答への補足

回答頂きありがとうございます。

補足します。
Aレンタルサーバのtemplates_cディレクトリの所有者と、phpの実行ユーザは同じです。
Bレンタルサーバのtemplates_cディレクトリの所有者と、phpの実行ユーザも同じです。

あと所属グループも同じです。

検索単語のヒントやサイトURLでもいいので何か教えて頂けたらありがたいです。

補足日時:2013/11/14 22:31
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qrequire_once()でファイルが読み込めません

すいません、色々やったみたのですがよく分からなかったので教えてください。

PHPのテンプレートのSmartyを使いたいと思い、公式サイトからダウンロードして/usr/local/lib/php/Smartyにコピーしました。

その後、php.iniのinclude_pathにて".:/usr/local/lib/php/Smarty"と設定し、require_once("Smarty.class.php");としたのですが、

failed to open stream: No such file or directoryや
Failed opening required 'Smarty.class.php'

というエラーが出て読み込めません。また、phpinfo()を見る限りではphp.iniはきちんと読みにいっているようでした。

ためしに/usr/にSmartyを置き、include_pathもそのように変更してみたのですが読み込めません。カレントディレクトリに配置した場合は上手く読み込めました。また、Smartyでなくてもどのファイルでも読み込めない状況です。

環境はFedora6、Apache2.0、PHP5です。何かアドバイスよろしくお願いします。

すいません、色々やったみたのですがよく分からなかったので教えてください。

PHPのテンプレートのSmartyを使いたいと思い、公式サイトからダウンロードして/usr/local/lib/php/Smartyにコピーしました。

その後、php.iniのinclude_pathにて".:/usr/local/lib/php/Smarty"と設定し、require_once("Smarty.class.php");としたのですが、

failed to open stream: No such file or directoryや
Failed opening required 'Smarty.class.php'

というエラーが出て読み込めません。また、phpinfo()を見る限...続きを読む

Aベストアンサー

Smarty.class.phpのパーミッションはどうですか?

include_path上にファイルが存在しても、Webサーバを動かしているユーザから読めなければ、ファイルが読めずエラーになります。

一時的に
chmod 755 Smarty.class.php
としてみてはどうでしょう?

これで動くようなら、所有者を変更するかして正しいパーミッションに戻せばよいと思います。

QSmartyでHTMLソースの変更が反映されません

お世話になります。

先日、デザイナーと全てのサイト及びフォーム関連を完全にテンプレート化しようという
話になり、Smartyを導入しフォーム関連に取り掛かっていたところ、テンプレートファイルの
内容を書き換えてリロードしても最新の内容がブラウザへ反映されませんでした。

PHPファイルをサーバへ上書きアップロードをすると最新の内容が反映されます。
しかし、デザイナーからしてみると細部の調整等を行う際にその都度PHPファイルも
アップロードするのが非常に面倒くさいので、テンプレートファイルのみをアップした
タイミングで最新の内容が反映する方法を1週間ほど調べてみたのですが、
上手く行かずに難儀しております。

この現象が発生するのは、セッションを使用したフォーム関連のページのみです。
「 templates_c 」ディレクトリのキャッシュファイルを削除しても変更されません。
Smartyの設定自体はデフォルトのままです。「 caching 」も0のままで、特に変更は
しておりません。

検証を手順として説明させていただくと、

1、テンプレートファイルのHTMLソースを変更してアップロード。

2、ブラウザで確認すると、変化無し。

3、「 templates_c 」のキャッシュファイルは更新されていて、中身を確認すると正常にコンパイルされている。

4、大元のPHPファイルを上書きアップロードしてブラウザをリロードすると、HTMLソースの変更内容が正常に反映される。

以上の事から、PHPのスクリプトに問題があるのかと思いましたので、勝手ながらスクリプトの
大まかな内容を記載させていただきます。

--- ■ ココから-------------------------------------------

// セッションの開始
session_cache_limiter("public");
session_start();

require("Smarty.class.php");

define("DEF_ACT", "entry"); // 初期アクセスしたページ
define("MAIL_TO", "アカウント@ドメイン"); // 送信先
define("subject", "テスト送信"); // 件名

// Smartyを走らせる
$smarty = new Smarty();
$smarty->template_dir = "./templates";
$smarty->compile_dir = "./templates_c";

// データをPOSTメソッドで
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$param = cnv_formstr($_POST);
}

// 各ページの判別処理を行い
$act = isset($param["act"]) ? $param["act"] : DEF_ACT;
$screen_function_name = "screen_" . $act;
if (!function_exists($screen_function_name)) {
exit();
}
call_user_func($screen_function_name, $param);
$temp_name = $act . ".html";

// テンプレートを表示する
$smarty->assign("url", $_SERVER["PHP_SELF"]);
$smarty->display($temp_name);

// =========================================================
// 入力画面( 初期アクセスしたページ )
// =========================================================
function screen_entry($param) {

~ 処理内容 ~

return TRUE;
}

// =========================================================
// 確認画面( 入力チェックが通った場合 )
// =========================================================
function screen_conf($param) {
global $smarty;

~ 処理内容 ~

return TRUE;
}

// =========================================================
// 送信完了画面
// =========================================================
function screen_submit($param) {
global $smarty;

~ 処理内容 ~

return TRUE;
}

// =========================================================
// 入力データチェック( 未入力等があった場合 )
// =========================================================
function screen_data($param) {
global $smarty;

~ 処理内容 ~

}

// =========================================================
// 配列を一括変換する
// =========================================================
function cnv_formstr($array) {

~ 処理内容 ~

}

--- ■ ココまで-------------------------------------------

PHPのバージョンは、5.3.3です。
因みにこのスクリプトでは、データベースは使用しておりません。

同様の経験をされて解決された方がおられましたら、ご教示の程
どうぞよろしくお願い申し上げます。

お世話になります。

先日、デザイナーと全てのサイト及びフォーム関連を完全にテンプレート化しようという
話になり、Smartyを導入しフォーム関連に取り掛かっていたところ、テンプレートファイルの
内容を書き換えてリロードしても最新の内容がブラウザへ反映されませんでした。

PHPファイルをサーバへ上書きアップロードをすると最新の内容が反映されます。
しかし、デザイナーからしてみると細部の調整等を行う際にその都度PHPファイルも
アップロードするのが非常に面倒くさいので、テンプレートファイルの...続きを読む

Aベストアンサー

ご質問斜め読みしかしてませんが。。

session_cache_limiter("public");

が犯人では?

テンプレートと同時にPHPを入れ替えないと反映されないとか聞いたことないっす。

多分 ブラウザが以前のキャッシュ使ってるだけだと思うっす。

Qtplを読みに行けません。

PHP+smartyを学んでいます。
Apache2-htdocs-taro-hanako.php とファイルを置き、一方、
Apache2-php_libs-smarty の下に
-libs/ (中にSmarty.class.php あり) と
-templates/ (中にtest.tpl あり)を並列的におきました。
hanako.php に、
require_once "../../php_libs/smarty/libs/Smarty.class.php";
$smarty = new Smarty;
$smarty->templete_dir = "../../php_libs/smarty/templates";
  $smarty->compile_dir = "../../php_libs/smarty/templates_c";
$smarty->cache_dir = "../../php_libs/smarty/cache";
以下省略・・・
と書いてブラウザで開くと、次のエラーが出て、tpl を読み込むことが出来ません。

Warning: Smarty error: unable to read resource: "test.tpl" in C:\Program Files\Apache Group\Apache2\php_libs\smarty\libs\Smarty.class.php on line 1088

どこを間違えているのでしょうか。

PHP+smartyを学んでいます。
Apache2-htdocs-taro-hanako.php とファイルを置き、一方、
Apache2-php_libs-smarty の下に
-libs/ (中にSmarty.class.php あり) と
-templates/ (中にtest.tpl あり)を並列的におきました。
hanako.php に、
require_once "../../php_libs/smarty/libs/Smarty.class.php";
$smarty = new Smarty;
$smarty->templete_dir = "../../php_libs/smarty/templates";
  $smarty->compile_dir = "../../php_libs/smarty/templates_c";
$smarty->...続きを読む

Aベストアンサー

Windows版だとなにか違うんでしょうかねぇ・・・
私はUNIX版で同じソースを書いてみたのですが、
正常に動作してます。
ちなみに私はこんな風に書いてみました。
(全て同一ディレクトリ)
・taro.php
<?php
  require_once "config.php";
  $smarty = new Smarty;
  $smarty->compile_dir = $cpl_dir;
  $smarty->templete_dir = $cnf_dir;
  $smarty->cache_dir = $cch_dir;

$smarty->assign("lista",dog);
$smarty->assign("listb",cat);
$smarty->display($doc_root . "test.tpl");
?>
・test.tpl
  <html>
  lista={$lista}<br>
  listb={$listb}<br>
  </html>
・config.php
<?php
  require_once "/usr/local/share/smarty/Smarty.class.php";
  $doc_root ="/usr/local/www/data-dist/test/";
  $cpl_dir = '/usr/local/share/smarty/template_c';
  $cnf_dir = '/usr/local/share/smarty/configs';
  $cch_dir = '/usr/local/share/smarty/cache';
?>
これだとうまくいくんですが、おっしゃっている障害の
原因とは考えにくいですねぇ・・・
おそらく、「$smarty->display();」の部分がキモだとは思うのですが、
Windows版でやった事が無いので、あまり参考にならないかもしれません。
パスの書き方をいろいろと工夫してみてはいかがでしょうか?
Apache(で動かしてるのかな!?)のドキュメントルートからパスを書いて
見るとか・・・いろいろと。

Windows版だとなにか違うんでしょうかねぇ・・・
私はUNIX版で同じソースを書いてみたのですが、
正常に動作してます。
ちなみに私はこんな風に書いてみました。
(全て同一ディレクトリ)
・taro.php
<?php
  require_once "config.php";
  $smarty = new Smarty;
  $smarty->compile_dir = $cpl_dir;
  $smarty->templete_dir = $cnf_dir;
  $smarty->cache_dir = $cch_dir;

$smarty->assign("lista",dog);
$smarty->assign("listb",cat);
$smarty->display($doc_ro...続きを読む

Q「ご連絡いたします」は敬語として正しい?

連絡するのは、自分なのだから、「ご」を付けるのは
おかしいのではないか、と思うのですが。
「ご連絡いたします。」「ご報告します。」
ていうのは正しい敬語なのでしょうか?

Aベストアンサー

「お(ご)~する(いたす)」は、自分側の動作をへりくだる謙譲語です。
「ご連絡致します」も「ご報告致します」も、正しいです。

文法上は参考URLをご覧ください。

参考URL:http://www.nihongokyoshi.co.jp/manbou_data/a5524170.html

Qpreg_match関数で正規表現の複数指定方法。

./aaaディレクトリ内においてファイル名に、『bbbb』及び『cccc』と言う文字列が含まれるファイルを./eeeディレクトリに移動させるスクリプトを考えております。

以下は『bbbb』のみを拾うようなスクリプトです。
=========
<?PHP
if ($dir = opendir("./aaa")) {
while (($file = readdir($dir)) !== false) {
if(preg_match("/bbbb/",$file)) rename("./aaa/".$file,"./eee/".$file);
}
closedir($dir);
}
?>
=========
上記は前にこちらで質問させていただき、正常に動くことを確認しております。
今回は『bbbb』及び『cccc』が含まれる場合に./eeeディレクトリに移動させることを考えております。
このような場合は『cccc』はどのよう記載すればよいのでしょうか?ご教授の程よろしくお願いいたします。

Aベストアンサー

どちらとも含まれる場合と言う意味ですよね?

単に preg_match をもう一回やればいいのではないかと。

if(preg_match("/bbbb/",$file)) {
if(preg_match("/cccc/",$file)) {
rename("./aaa/".$file,"./eee/".$file);
}
}

QDBエラーの意味

フォームからDBにデータ挿入しようとすると

Column count doesn't match value count at row 1

というエラーが出てしまいます・・・どういう意味を持ったエラーなんでしょうか?

Aベストアンサー

カラム数と値の数が合わない、と言う事です。簡単な英語なので覚えましょう。
カラム数が4つにもかかわらず、
"INSERT INTO tablename VALUES (1,'hoge',3)"
とやった場合等に出るエラーだと思います。

Qforeachで回った数を表示したい

単純な質問ですみません。
====
//getTestlistは別ファイルで定義済み。
<?
$testlist=getTestlist();
foreach($testlist as $test){
?>


<? } ?>
====
例えば↑こんなふうにforeachで$testlistが存在するだけ回したとします。
そのときに何回まわったか?($testが何件あったか?)だけを表示したいのですが、そんなことってできますか?
表示したい位置は<? } ?>の外側にと考えています。
あさってな質問でしたらすみません。
phpVer 4.3

よろしくお願いいたします。

Aベストアンサー

<?
$testlist=getTestlist();
$n=0;
foreach($testlist as $test){
$n++;
?>
<?}?>

<?=$n?>回
とかでよいかと思います。

途中でbreakなどが無ければ
<? echo count($testlist) ?>でも良いかも知れません。

Q連想配列からの値の取り出し

お世話様です。

タイトルにもありますが連想配列を作成した後(以下に記述例)に
その配列からキーを指定して値を取得したいと思っております。
array_keys関数だと値を指定してキーを取得するみたいで
うまくいきませんでした。
何かよい方法ありませんでしょうか?

//配列に格納
while (条件) {
  $aParaOra += array((キー) => (値));
}

Aベストアンサー

解答番号No.1の者です。

ちなみに、キーの指定なしで全部取得するのであれば、
array_values($aParaOra)
で、配列化されたものが返ってきます。

もしくは、以下のようにforeachでループすれば、
キーと値を分離して取得できます。
foreach ($aParaOra as $key => $value) {
# $aParaOra[$key]の値が、$value
}

質問者さんが何をしたいのかがいまいちピンときません。

Q$smarty->compile_dir について

Fatal error: Smarty error: the $compile_dir 'templates_c' does not exist, or is not a directory.
上記エラー表示となる理由が分かりません。誰か教えてください。

▼質問したい内容
・「templates_c」ディレクトリをドキュメントルートから外してはいけないのでしょうか?
・$smarty->compile_dirを指定しなくても、勝手に「templates_c」ディレクトリを探しにいくのでしょうか?

▼経緯
「templates」「templates_c」ディレクトリをドキュメントルートから外したら(public_htmlより上の階層に置くように変更したら)、上記エラーが出るようになりました。
「templates_c」ディレクトリをドキュメントルートへ戻すと、正常表示されます。
(但し、その際、$smarty->compile_dirは、public_htmlより上の階層を指定したままなのに、正常表示される理由が不明)
試しに、$smarty->compile_dir表記自体を外してみましたが、それでも、正常表示されてしまいます。

「templates_c」ディレクトリのパスは、$smarty->compile_dirで指定しているのでは、ないでしょうか?

「templates_c」ディレクトリのパスはどこで指定をすればよいか、
また、ドキュメントルートを外してもよいか、
この2点、誰か教えて~。

※わざわざ「templates_c」ディレクトリを、ドキュメントルートから外さなくてもよいかとは思いますが、「templates」ディレクトリと同じところに置こうとも思ったら、出来なかったので、その理由を知りたいと思ってます。

Fatal error: Smarty error: the $compile_dir 'templates_c' does not exist, or is not a directory.
上記エラー表示となる理由が分かりません。誰か教えてください。

▼質問したい内容
・「templates_c」ディレクトリをドキュメントルートから外してはいけないのでしょうか?
・$smarty->compile_dirを指定しなくても、勝手に「templates_c」ディレクトリを探しにいくのでしょうか?

▼経緯
「templates」「templates_c」ディレクトリをドキュメントルートから外したら(public_htmlより上の階層に置く...続きを読む

Aベストアンサー

>「templates_c」ディレクトリをドキュメントルートから外してはいけないのでしょうか?
パスの指定やパーミッション設定さえ間違っていなければ、ドキュメントルートから外して問題ありません。
当方自身、ドキュメントルート以下フォルダ階層の深い位置に置いた場合でも、まったく問題なく動作しています。
ドキュメントルートより上に置いた事はありませんが、理論上はまったく問題ないはずです。

>$smarty->compile_dirを指定しなくても、勝手に「templates_c」ディレクトリを探しにいくのでしょうか?
$smarty->compile_dirで指定せず省略された際には、デフォルト設定の[templates_c]という名前のフォルダが使用されます。

>$smarty->compile_dirは、public_htmlより上の階層を指定したままなのに、正常表示される理由が不明
おそらくですが、正しくパスが設定されていない事が原因でしょう。
相対パスを使用しているのではないかと思いますが、相対パスの基準位置等を勘違いされていて、正しく設定できていないのではないかという気がします。
相対パスで混乱するようであれば、絶対パスを指定してください。

>「templates」ディレクトリと同じところに置こうとも思ったら、出来なかったので
FTPソフトによっては、サーバー上で[移動]や[コピー]ができない場合があります。
あるいは、キャッシュが更新されていないために、古い状態が表示されているだけなのかも知れません。
『最新の状態に更新』をして、かつ、『ディレクトリの作成』をした場合でも同様でしょうか?

複数の現象が、それぞれ別の原因で発生して、切り分けができずに混乱状態なのだろうと想像できますが、ひとつひとつ解きほぐしてください。

>「templates_c」ディレクトリをドキュメントルートから外してはいけないのでしょうか?
パスの指定やパーミッション設定さえ間違っていなければ、ドキュメントルートから外して問題ありません。
当方自身、ドキュメントルート以下フォルダ階層の深い位置に置いた場合でも、まったく問題なく動作しています。
ドキュメントルートより上に置いた事はありませんが、理論上はまったく問題ないはずです。

>$smarty->compile_dirを指定しなくても、勝手に「templates_c」ディレクトリを探しにいくのでしょうか?
$sm...続きを読む

QSmartのカスタマイズでエラー

いつもお世話になっております。

Smartyのカスタマイズを行いたく
設置でエラーになってしまいました。

public_htmlと同じ階層にSmartyフォルダを作成しました。
(下記のような構造になっています。)

/public_html/
/Smart/configs/
/Smart/lib/
/Smart/templates/
/Smart/templates_c/


ファイルには下記のように記述しております。

/Smart/lib/smarty_setup.php
----------------------------------------
require_once 'Smarty.class.php';

class SmartySetup extends Smarty {
 function SmartySetup() {
  $this->template_dir = SMARTY_DIR . "templates";
  $this->compile_dir = SMARTY_DIR . "templates_c";
  $this->cache_dir = SMARTY_DIR . "cache";
  $this->config_dir = SMARTY_DIR . "configs";

  $this->left_delimiter = "<!--{";
  $this->right_delimiter = "}-->";
 }
}
----------------------------------------


/public_html/smarty.php
----------------------------------------
require_once("../../Smarty/libs/smarty_setup.php");
$smarty = new Smarty();
$smarty->display("smarty.tpl");
----------------------------------------



実行すると、下記のようなエラーが表示されてしまいます。
Fatal error: Uncaught exception 'SmartyException' with message 'Unable to load template file 'smarty.tpl'' in C:\*****\Smarty\libs\sysplugins\smarty_internal_template.php:163 Stack trace: #0 C:\*****\Smarty\libs\sysplugins\smarty_internal_template.php(541): Smarty_Internal_Template->isExisting(true) #1 C:\*****\Smarty\libs\Smarty.class.php(337): Smarty_Internal_Template->getRenderedTemplate() #2 C:\*****\Smarty\libs\Smarty.class.php(381): Smarty->fetch('smarty.tp...', NULL, NULL, NULL, true) #3 C:\*****\smarty.php(26): Smarty->display('smarty.tp...') #4 {main} thrown in C:\*****\Smarty\libs\sysplugins\smarty_internal_template.php on line 163


どう対処すればいいでしょうか。
よろしくご教示お願いいたします。

いつもお世話になっております。

Smartyのカスタマイズを行いたく
設置でエラーになってしまいました。

public_htmlと同じ階層にSmartyフォルダを作成しました。
(下記のような構造になっています。)

/public_html/
/Smart/configs/
/Smart/lib/
/Smart/templates/
/Smart/templates_c/


ファイルには下記のように記述しております。

/Smart/lib/smarty_setup.php
----------------------------------------
require_once 'Smarty.class.php';

class SmartySetup extends Smarty {
 function SmartySetup...続きを読む

Aベストアンサー

Smarty.class.php で SMARTY_DIRは定義されていましたが、class 定義の外に実装されています。

if (!defined('SMARTY_DIR')) {
define('SMARTY_DIR', dirname(__FILE__) . DS);
}

こんな感じ。そうすると
> $this->template_dir = SMARTY_DIR . "templates";

は Smarty.class.php のあるディレクトリの配下に templates ディレクトリがあるようになりますが、問題ありませんか?

PATHがズレているように思うのですが。


人気Q&Aランキング

おすすめ情報