5

私は自分の問題を解決するための潜在的な方法でいっぱいの交差点の前に立っています。私の問題は、特定のユーザーに、関連するPDFファイルをレンダリングする一意のページを紹介したいということです。できれば、関連するMySQLデータとPDFレンダリング用のプラグインがない1つのサイトを参照したいと思います。うまくいけば、あなたは私がどの解決策を使うべきかについていくらかの光を当てることができます。

参照

  • サイトA-私が彼らに紹介したいサイト
  • サイトB -MySQLデータとPDFプラグインを含むサイト

情報

  • どちらのサイトもCakePHP1.3を介して構築されています
  • 現在、サイトAにはデータベースが接続されていません。サイトBへのAPI呼び出しでのみ実行されます。
  • これらのPDFを生成するのはそれほど重くはありませんが、これを説明するソリューションを見つけることは興味深いでしょう。
  • これらのPDFへの参照はイベント時に発生し、同時に何千人ものユーザーに送信されることはありません。

解決策#1

それらをサイトBに紹介し、そこですべてを生成します。

長所:簡単に修正できます。
短所:これらのユーザーにサイトBを知られたくない。サイトBは主に内部通信を目的としているため、特定のユーザーにはこれを利用しないのが最善です。
考え:むしろこれを避けてください。

解決策#2

ソリューション#1に等しいページ をcURLし、同じ結果を出力するページをサイトAに配置します。

長所:ほぼ同じように簡単に修正できます。
短所:何も考えられません。
考え:ブラウザは私がPDFを出力したことを理解しますか?または、(可能であれば)cURLリクエストからのヘッダー応答をコピーして、header()出力前に独自に設定しますか?

解決策#3

サイトBでPDFを1回生成し、サイトAに配置します。次に、.pdfリンクを参照します。

長所:読み込みが速くなります。この場合は重要であり、見過ごされる可能性さえあります。
短所: PDF出力を簡単に変更することはできません。
考え:ファイルを転送するにはどうすればよいですか?2つのサイトは同じサーバー上にあるため、パスを変更するだけで可能ですが、サイト間の他のすべての通信は、サーバーを共有する必要がないように行われます。そのデザインを破るのは恥ずべきことです。たぶん、高度なcURLリクエストを実行し、PDFファイルをPOSTとしてサイトBからサイトAに送信してアップロードする必要がありますか?しかし、きちんとした解決策とは思えません。

解決策#4

サイトAからサイトBにAPIを実行して、URLからIDに基づいて関連データを取得します。ただし、サイトAにもPDFプラグインがあります。

長所:ある意味では、非常に論理的なアプローチです。
短所:すべてのPDFをサイトBでのみ生成したいと思います。それらすべての管理が容易になります。
考え:このアプローチがソリューション2と比較して、(もしあれば)どれだけ有益かは少しわかりません。

お時間をいただき、ありがとうございました。与えられた解決策の1つをやる気にさせるか、独自の解決策を提示してください。

編集:コードサンプルは常に高く評価されていますが、どちらのソリューションを使用する必要があるのか​​について、私は共鳴と論理にもっと興味があります。私はすでに、コーディングを通じてこれらのソリューションのほとんどを解決する方法を知っています。訪問者の方は、返信に関する関連する機能や方法に自由にリンクしてください。

4

3 に答える 3

1

サイト B を世間の目から隠したいようです。

最も簡単な方法は、サイト A とサイト B の間にリバース プロキシを作成することです。

編集:

リバース プロキシはクロス ドメインにすることができます。サーバーは、サイト A からアクセスできるサイト B を除いて、共通のものを共有する必要はありません (これは既に存在しているように聞こえます)。

Apache には mod_proxy ( http://httpd.apache.org/docs/2.2/mod/mod_proxy.html )を使用した単純なアプローチがあります。

Google で簡単に検索すると、Apache でセットアップするためのガイドが表示されます。http://www.apachetutor.org/admin/reverseproxies

Nginxにも http://www.cyberciti.biz/tips/using-nginx-as-reverse-proxy.htmlがあります

IIS はもう少し複雑で、セットアップしたことはありませんが、ドキュメントによると機能は存在します。

EDIT 2: 近づいています

ここでは、PHP コンポーネントについて心配する必要はありません。Apache サーバーは、指定されたプロキシに基づいてリクエストを転送します。たとえば、プロキシが Sitea.com/pdf siteb.com/ に設定されている場合、sitea.com/pdf/alpha.pdf は実際に siteb.com/alpha をリクエストします。 pdf . このスキーマでは、sitea.com PHP ルーティングをすべて一緒に無視しますが、本格的な要求であるが sitea の Web サーバーによって行われるため、siteb.com ルーティングを尊重します。

siteb の要求を尊重することに関しては、sitea.com/pdf/getpdf.php?id=1 が sitea.com/getpdf.php?id=1 に行くように実際にすべての動きを通過することを意味します。

または、pdf.sitea.com などの siteA.com に VHOST をセットアップする場合は、pdf.sitea.com を siteb.com にマップするプロキシをセットアップできますが、sitea と siteb の両方がパブリックにアクセスできる場合、これは役に立ちません。

リバース プロキシは、sitea.com が視聴者に利用可能であり、siteB がアクセスが制限されたファイアウォールの背後にある場合に最適に機能します。そのため、プロキシは、sitea.com が他の方法ではアクセスできない siteb.com のセクションにアクセスできるようにします。

変更されるファイルは、proxy_mod を有効にし、VHOST またはサーバー構成で ProxyPass および ProxyReversePass を設定することにより、ホストの siteA.com Apache 構成です。

于 2012-11-28T15:39:30.080 に答える
0

興味深い質問です。すべての異なるソリューションから、私はあなたができることにおいて非常に柔軟であると思います。

個人的には、サイトBをデータベースを含むジョブキューサーバーとして使用します(ただし、別のサーバーではデータベースの方が適しています)。ユーザーのメールアドレスを尋ねると、ジョブ(PDFの処理)が完了すると、ユーザーにメールが送信されます。または、コメントで提案したことを実行して、「PDFを生成します。10秒で更新されます」というページに送信できます。生成されたPDFが見つかるまで更新を続ける「秒」。これにより、かなり適切に拡張でき(ワーカーを追加するだけ)、PDFの生成中にユーザーを拘束することはありません。

Gearmanを使用してPHPとインターフェースし、ジョブキューを作成できます。

http://php.net/manual/en/book.gearman.php

長所

  • 非常に適切にスケーリングします-一度に生成するPDFを増やす必要がある場合は、ワーカーを追加するだけです
  • PDFの生成中にページがクラッシュしたと考えて使用が妨げられることはありません
  • PDFだけでなく、CPUを集中的に使用するジョブをキューに入れることができます。
  • サイトのトラフィックが増加しても、取り除いて別のものに置き換える必要はありません(ワーカーを追加するだけです)
  • PDFを生成しようとしているプロセス/スレッドの数を制御できます(たとえば、apacheを使用すると、一度に10個以上のPDFを生成できます。Webリクエストプロセスで直接実行する場合は、ほとんど制御できません。攻撃者がサイトをクラッシュさせる)

短所

  • ギアマンの設置とセットアップが必要
  • 実際にPDFを生成するには、ギアマンPHPスクリプトを作成する必要があります

私がこのルートをたどる主な理由は、ユーザーエクスペリエンス、スケーラビリティの容易さ、およびワーカープロセスの制御のためです。

サイドノート

サイトAとBの設定は少し奇妙に思えますが、理由はあると思います。サーバーが2つある場合は、サイトAにnginxを配置し、Apache、DB、およびギアマンを搭載した内部サーバーBにすべてのリクエストをプロキシすることをお勧めします。その後、サイトのトラフィックが増加するにつれて、アプリを分離してサーバーを分離することができます。

于 2012-11-28T13:46:01.080 に答える
0

PDFを生成して直接(ダウンロードダイアログなしで)出力する「非表示」または少なくとも未知のページをサイトBにいつでも作成できます。次に、サイト A で、サイト B へのリンクを内破して、サイト B からコンテンツをダウンロードし、それをユーザーに表示することができます。

ユーザーはサイト B が存在することを知りませんが、2 つのサーバー間のデータ トラフィックが増えるため速度が低下します。

サイト B の hiddenfile.php:

<?
$p = new PDFlib();
if ($p->begin_document("", "") == 0) {
    die("Error: " . $p->get_errmsg());
}
$p->set_info("Creator", "Hugo Delsing");
$p->set_info("Author", "Hugo Delsing");
$p->set_info("Title", 'Hi');

$p->begin_page_ext($docWidth, $docHeight, "");

$p->end_page_ext("");
$p->end_document("");

$buf = $p->get_buffer();

$len = strlen($buf);
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=hello.pdf");
print $buf;
exit;
?>

およびサイトで downloadFile.php

<?
$content = implode('', file('siteb/hiddenfile.php?user=1'));
$len = strlen($content );
header('Content-type: application/pdf');
header("Content-Length: $len");
header('Content-Disposition: attachment; filename="downloaded.pdf"');
print $content;
exit;
?>

したがって、別のサーバーオプションを維持するために、ソリューションBを別の方法で使用すると思います。なんで?すべてのソリューションは優れていますが、これには短所はありません。だから私はあなたがあなた自身の質問に答えたと思います。

于 2012-11-28T13:34:28.790 に答える