簡體   English   中英

生成 PHP 頁面的最佳方法是什么?

[英]The best way to generate a PHP page?

我最近開始研究像網站這樣的圖像板,當單擊“創建線程”按鈕時,我偶然發現需要生成一個隨機 PHP 頁面,我嘗試用谷歌搜索如何做到這一點,但不幸的是沒有找到任何線索,所以我嘗試了即興發揮一點,想出我自己的解決方案,我發現的唯一解決方案是:

<?php 
$randomizer = rand(0,30000)*rand(123456,2323232);
$file = fopen("$randomizer.php",'w');
$username = $_POST['user'];
$threadContent = $_POST['content'];
$phpString = " <!DOCTYPE html>
               <html>
               <head>
                   <title>Main page</title>
fwrite($file, $phpString);
header("location: $randomizer.php");

$phpString 基本上包含我想生成的頁面的整個 HTML 和 PHP,所以我不能把它全部包含在這里它真的很長。 這種方法正常工作,所以我只是想知道是否有更好的方法來做到這一點。

正如評論中所說,這不是一個好主意,原因有很多。 我將展示其中的一些,最后會展示一些關於正確執行此操作的方法和可以提供幫助的框架的概念證明。 如果您仍想以這種方式進行操作,請檢查此 awnser

由服務器所有者維護

每個“線程”創建一個文件會使事情很難改變。 如果您對線程創建者代碼有一些錯誤(或者甚至想要更改一些視覺效果、品牌、添加新功能等),您將不得不更改每個已經生成的文件。

安全

一個安全漏洞會疊加到 N 個文件中,讓人非常頭疼。 在您的示例中,如果您編寫沒有threadContent的 threadContent,它將導致應該在每個已生成的文件上搜索並修復XSS

用戶管理

要編輯拼寫錯誤或生成文件的用戶想要的任何其他內容,他必須有權編輯您服務器上的文件,或者您必須創建一個腳本來直接更改文件內容,這很糟糕。

搜索引擎

想象一下,在您的網站上創建一個搜索引擎以在所有文件上按標題、內容等查找某個線程是多么困難。

有趣的事實

如果 StackOverflow 站點使用這種方法並且每個問題文件有 ~10kb,那么它只有 ~206GB 的問題文件需要管理。 你可以 在這里看到 StackOverflow 有多少問題。


應該怎么做?

有很多方法可以做到這一點,我將展示一種非常簡單的解釋和一些可以幫助您的框架。

數據可以存儲在您的數據庫中,例如:

ID 用戶身份 標題 內容
1 1 例子 洛雷姆·伊普蘇姆...

然后創建一個文件作為模板來為所有用戶生成的線程提供服務:

線程模板.php

<!DOCTYPE html>
  <html>
    <head>
      <title><?php echo htmlspecialchars($post['title'], ENT_QUOTES, 'UTF-8'); ?></title>
    </head>
    <body>
      <?php echo htmlspecialchars($post['content'], ENT_QUOTES, 'UTF-8'); ?>
    </body>
</html>

在渲染模板之前,您需要從數據庫中獲取數據:

$stmt = $pdo->query("SELECT * FROM posts WHERE id = 1");
$post = $stmt->fetch();
require("thread-template.php");

構架

使用MVC 方法,許多框架可以幫助您輕松完成。

Model

模式的中心組件。 它是應用程序的動態數據結構,獨立於用戶界面。 它直接管理應用程序的數據、邏輯和規則。

看法

信息的任何表示形式,例如圖表、圖表或表格。 相同信息的多個視圖是可能的,例如用於管理的條形圖和用於會計師的表格視圖。

Controller

接受輸入並將其轉換為 model 或視圖的命令。

Laravel

Codeigniter

CakePHP

正如其他人在評論中所說,這絕對不是使用 PHP 服務器為 HTML 服務的最佳方式。 但是,如果你真的想通過在 PHP 中創建一個文件然后提供它來服務 HTML,你可以使用include()來指向你創建的文件。

<?php 
$randomizer = rand(0,30000)*rand(123456,2323232);
$file_path = "/tmp/"."$randomizer.php";
$file = fopen($file_path,'w');
$username = $_POST['user'];
$threadContent = $_POST['content'];
$phpString = " <!DOCTYPE html>
               <html>
               <head>
                   <title>Main page</title>
               </head>
               <body>Wrote ".$randomizer."
               </body>
               </html>";

fwrite($file, $phpString);
include($file_path);
?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM