sleepとheader関数 - PHPプロ!Q&A掲示板

1512

  • 0P

sleepとheader関数

質問日時 / 2008年9月22日 12:07    回答数 / 8件

Questioner:  sigebo  このエントリーをはてなブックマークに追加 

キーワード / sleep関数    header関数   

ユーザからのリクエストパラメータが不当な場合、所定の頁(トップ頁)に数秒後に移動させようとしています。下記のコードにしたのですが、うまく移動できません。案内メッセージは表示されます。何が原因でしょうか。
なお不当なパラメータになる原因は、パラメ-タを変更したため、以前の検索エンジンの結果から呼び出したためです。
本題とはずれますが、検索エンジン内の古い無効な登録内容を消去させる方法は無いものでしょうか。かなり古い結果も残っているようなのです。

>>CODE
<?php

// $_GET 処理

if(パラメータが正当){

  正当なレスポンス処理
}
else {
   redirect();


function redirect()
{
global $charset;

printf("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n");
printf("<HTML>\n");
printf("<HEAD>\n");
printf("<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",$charset);
printf("</head><body>\n");

printf("検索エンジンの古い検索結果からの呼び出しのため、処理できません。5秒後にトップ頁に移動しますので、改めてトップ頁からたどってください。");

printf("</BODY></html>\n");

sleep(5);
header("Location: http://sigesplants.chicappa.jp/");
}
<CODE


ツリー一覧

┣A01moochomoochoと申します。 header()とsleep()の使い方を
┃┗A01-1sigebo早速のご返事ありがとうございます。header関数の意味
┣A02tezcelloheader() のマニュアルをもう一度読んでみてください
┃┗A02-1sigebo早速のご返事ありがとうございます。 参照しているマ
┣A03NurseAngel「マニュアル」とは、 http://www.php.net/manual/ja
┃┗A03-1sigebo>そのRefreshですが、・・・よく見ましょう。 セミコ
┃ ┗A03-1-1weekendphpマニュアル(http://jp2.php.net/header)にも例があ
┃  ┗A03-1-1-1sigebo大変参考になる情報ありがとうございました。以前から
┗A04NurseAngelこの意見は投稿者によって削除されました。

回答一覧

並び替え:

A01 参考になった
answerermoocho [9月22日 12:28]

moochoと申します。

header()とsleep()の使い方を勘違いされていますね。

header("Location: ...")はサーバ側で
ページ遷移を実行するためのものです。

それと、printf("...");などのように文字列を出力した時点で
header()は利用できません。
エラーになりますが、詳しくはマニュアルを読んでください。

sleep()もサーバ側でのPHPスクリプトの実行を遅延させるものです。

指定秒待ったあと、出力結果がブラウザに返ってくるだけなので
希望されている処理にはならないでしょう。

画面出力後、数秒待ってページを切り替える場合は
METAタグのRefreshを利用するか、Javascriptのlocationを使用します。

この意見に回答する

ツリーへ TOPへ

A01-1
replyersigebo [9月22日 13:25]

早速のご返事ありがとうございます。header関数の意味が良くわからないまま使いました。
それで、ご案内のJavaは簡単には導入できないので、Refreshを使ってみました。
しかし、移動はできず、5秒ごとに案内の画面が表示されるだけのように見えました。
それで、あきらめています。

  1. printf("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n");
  2.   printf("<HTML>\n");
  3.   printf("<HEAD>\n");
  4.   printf("<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",$charset);
  5.   printf("<META http-equiv=\"Refresh\" content=\"5,URL=http://sigesplants.chicappa.jp/\">\n");
  6.   printf("</head><body>\n");
  7.  
  8.   printf("検索エンジンの古い検索結果からの呼び出しのため、処理できません。5秒後にトップ頁にジャンプします。<br>");
  9.  
  10.   printf("<a href=\"http://sigesplants.chicappa.jp/\">http://sigesplants.chicappa.jp/</a>");  
  11.  
  12.   printf("</BODY></html>\n");

この意見に回答する

ツリーへ TOPへ

A02 参考になった
answerertezcello [9月22日 13:04]

header() のマニュアルをもう一度読んでみてください。
「すべての実際の 出力の前にコールする必要があることです」と書いてあります。

header() の前に、既にHTML文を出力してしまっていますよね?
その為に、location で飛ばそうとしているのが効果を果たしていないのだろうと思います。

この意見に回答する

ツリーへ TOPへ

A02-1
replyersigebo [9月22日 13:33]

早速のご返事ありがとうございます。
参照しているマニュアルには、そのような記述はありませんでしたが、Header関数の機能を類推すれば、わからないこともありません。 それならばと、つぎのように
まず、案内頁を出力してから、5秒スリープして、その後、header関数だけ送るようにしました。
しかし、これでも、うまくジャンプしませんでした。

うまくいく方法が見つかればよいですが、とりあえず、ジャンプ先だけ案内の頁を送り、それをクリックしてもらうようにしました。


  1. printf("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n");
  2.   printf("<HTML>\n");
  3.   printf("<HEAD>\n");
  4.   printf("<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",$charset);
  5.   printf("</head><body>\n");
  6.  
  7.   printf("検索エンジンの古い検索結果からの呼び出しのため、処理できません。5
  8. 秒後にジャンプします。<br>");
  9.  
  10.      printf("</BODY></html>\n");
  11.  
  12.   sleep(5);
  13.  
  14.   header("Location:http://sigesplants.chicappa.jp/");

この意見に回答する

ツリーへ TOPへ

A03 満足
answererNurseAngel [9月22日 13:56] (最終編集:9月22日 14:06)

「マニュアル」とは、
http://www.php.net/manual/ja/
のことです。


headerで送られるメッセージヘッダは、
<head>で送られるヘッダとはまったく別物で、
メッセージそれ自体の動作を決めるものです。
http://www.atmarkit.co.jp/fnetwork/rensai/netpro01/message.html
メッセージボディの後にメッセージヘッダを送信しても正しく動作しません。

リフレッシュ動作はメッセージボディ内の<head>で行う必要があります。


そのRefreshですが、
<meta http-equiv="Refresh" content="秒数;URL=遷移先">
です。よく見ましょう。



#header()をメッセージヘッダとかHTTPヘッダと呼ぶ場合、
#<head>は何と呼べばいいんだろう…?

この意見に回答する

ツリーへ TOPへ

A03-1
replyersigebo [9月22日 14:42]

>そのRefreshですが、・・・よく見ましょう。
セミコロンをコンマとしていた間違いがわかりました。修正してOKでした。

Hedaerのマニュアルをご紹介ありがとうございます。良くわからない所がありますが、今回の課題について、header関数は有用でしょうか。有用な場合、どの様に使えばよいでしょうか。

この意見に回答する

ツリーへ TOPへ

A03-1-1 満足
replyerweekendphp [9月22日 15:18] (最終編集:9月22日 15:19)

マニュアル(http://jp2.php.net/header)にも例がありますが、
header関数は、HTTPヘッダーを返す際に有用です。

HTTPヘッダーについては、下記などを参照してみてください。
http://www.studyinghttp.net/header

具体的には、
・HTMLの文字コードの送出
・リダイレクト処理
・キャッシュ制御の送出
・ファイルをダウンロードさせる
際などに使われる事が多いです。

以上、参考まで。

この意見に回答する

ツリーへ TOPへ

A03-1-1-1
replyersigebo [9月22日 19:39]

大変参考になる情報ありがとうございました。以前からHeaderの内容については知りたいと思っていましたので、いくつかの疑問もわかりました。

この意見に回答する

ツリーへ TOPへ

A04
answererNurseAngel [9月22日 13:56]

この意見は投稿者によって削除されました。

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)