


Ich möchte eine Website mit einer sehr kleinen Anzahl von Benutzern erstellen. Die Anzahl der Benutzer liegt zwischen einigen und mehr als einem Dutzend.
Das Backend verwendet PHP und jetzt möchte ich wissen, wie man Daten speichert.
Da die Anzahl der Benutzer sehr gering ist, fühlt sich die Verwendung von MySQL auch sehr niedrig an und kann die Leistung beeinträchtigen, da die Hostkonfiguration zu niedrig ist.
Ich habe darüber nachgedacht, es direkt in einer Datei zu speichern (die Daten haben eine relativ einfache Struktur und JSON kann damit umgehen), aber wenn es eine verwandte Abfrage gibt (z. B. den Join von MySQL), müssen Sie dafür PHP verwenden Die entsprechende Abfrage selbst ist etwas mühsam.
Gibt es einen besseren Weg? Wie eine superleichte Datenbank?
PS: Sie benötigen kein Redis, da die Hostkonfiguration niedrig und der Speicher definitiv knapp ist. Unternehmen wie MySQL und Redis, die hart daran arbeiten, Wunder zu vollbringen, können in einer so schlampigen Umgebung ihre Stärke nicht ausspielen.
Antwortinhalt:
Ich möchte eine Website mit einer sehr kleinen Anzahl von Benutzern erstellen. Die Anzahl der Benutzer liegt zwischen einigen und mehr als einem Dutzend.
Das Backend verwendet PHP und jetzt möchte ich wissen, wie man Daten speichert.
Da die Anzahl der Benutzer sehr gering ist, fühlt sich die Verwendung von MySQL auch sehr niedrig an und kann die Leistung beeinträchtigen, da die Hostkonfiguration zu niedrig ist.
Ich habe darüber nachgedacht, es direkt in einer Datei zu speichern (die Daten haben eine relativ einfache Struktur und JSON kann damit umgehen), aber wenn es eine verwandte Abfrage gibt (z. B. den Join von MySQL), müssen Sie dafür PHP verwenden Die entsprechende Abfrage selbst ist etwas mühsam.
Gibt es einen besseren Weg? Wie eine superleichte Datenbank?
PS: Sie benötigen kein Redis, da die Hostkonfiguration niedrig und der Speicher definitiv knapp ist. Unternehmen wie MySQL und Redis, die hart daran arbeiten, Wunder zu vollbringen, können in einer so schlampigen Umgebung ihre Stärke nicht ausspielen.
Verwenden Sie SQLite oder einfach Dateispeicherung. Wenn Dateispeicherung verwendet wird, sollten die Datendateien außerhalb des Webroots platziert werden.
Die richtige Antwort oben ist SQLite. Es ist leichtgewichtig und erfordert keine Dienste, sondern nur Dateien. Der Kunde des Projekts, an dessen Forschung und Entwicklung ich zuvor teilgenommen habe, ist SQLite
Es ist immer noch MySQL. Die Effizienz beim Lesen und Schreiben von Dateien ist geringer als bei der Verwendung von MySQL und wird beim Entwickeln besonders schwierig. Ich schlage vor, dass Sie es zuerst versuchen. Wird die Host-Konfiguration niedriger sein als die des Raspberry Pi? Wenn die Hostkonfiguration bereits niedrig ist, gibt es natürlich keine Möglichkeit, Windows zu installieren.
Wenn Sie mit ORM entwickeln, müssen Sie die Auswahl einer Datenbank in einem frühen Stadium nicht berücksichtigen.
Wenn Sie eine SQL-Entwicklung schreiben, müssen Sie berücksichtigen, dass die Datenbank in der Zukunft geändert wird. Das von Ihnen geschriebene SQL ist möglicherweise nicht kompatibel
SQLite wird mit Erweiterungen geliefert. Obwohl die Funktionen und Datentypen viel einfacher sind als bei MySQL, sind die häufig verwendeten in Ordnung und die Leistung ist ebenfalls sehr gut.
Wenn Sie SQLite verwenden, platzieren Sie die Datendatei am besten nicht im Stammverzeichnis der Website, da die Leute sie sonst herunterladen, wenn sie die URL kennen.
Natürlich können Sie Apache/Nginx so konfigurieren, dass Anfragen abgelehnt werden um auf bestimmte Dateien zuzugreifen, aber es stellt immer noch eine versteckte Gefahr dar,
Deshalb ist es besser, es außerhalb des Stammverzeichnisses der Website zu platzieren.
Außerdem müssen Sie, wenn Sie SQLite verwenden, SQL-Sprache schreiben und verwenden Sie den PDO-Funktionssatz, um Folgendes auszuführen:
<code><?php function db() { static $db; if ($db) { return $db; } else { try { $db = new PDO('sqlite:'.$_SERVER['DOCUMENT_ROOT'].'/../data.db3'); } catch (PDOException $e) { echo $e->getMessage(); exit(); } return $db; } } function insert($title = '', $content = '') { global $app; $db = db(); $stmt = $db->prepare('INSERT INTO posts (post_title, post_content) VALUES (?, ?)'); $stmt->bindParam(1, $title, PDO::PARAM_STR); $stmt->bindParam(2, $content, PDO::PARAM_STR); $stmt->execute(); return ($stmt->rowCount() !== 0) ? array(true, 'lastInsertId' => $db->lastInsertId()) : array(false, 'lastInsertId' => $db->lastInsertId()); } function select($id = '') { global $app; $db = db(); if (!empty($id)) { return $db->query('SELECT * FROM posts WHERE id = '.intval($id))->fetchAll(PDO::FETCH_ASSOC); } else { return $db->query('SELECT * FROM posts')->fetchAll(PDO::FETCH_ASSOC); } } function select_v2($id = '') { global $app; $db = db(); if (!empty($id)) { $stmt = $db->prepare('SELECT * FROM posts WHERE id = ?'); $stmt->bindParam(1, $id, PDO::PARAM_INT); } else { $stmt = $db->prepare('SELECT * FROM posts'); } $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC); } function update($id, $title = '', $content = '') { global $app; $db = db(); //echo PDO::ATTR_AUTOCOMMIT; //返回0可见PDO默认禁用自动提交事务. //echo $db->getAttribute(PDO::ATTR_AUTOCOMMIT); exit(); //返回1可见MySQL默认会自动提交事务. //SQLite不支持设置PDO::ATTR_AUTOCOMMIT: //SQLite: Uncaught exception 'PDOException' with message 'The auto-commit mode cannot be changed for this driver' //$db->setAttribute(PDO::ATTR_AUTOCOMMIT, false); $db->beginTransaction(); $stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?'); $stmt->execute(array($title,$content,$id)); //所有值视作PDO::PARAM_STR处理 //$stmt->execute(array(':title' => $title,':content' => $content,':id' => $id)); //$stmt->bind_param('ssi', $title, $content, $id); //对比mysqli echo 'sleep(3);'."\n"; sleep(3); $db->commit(); //$db->setAttribute(PDO::ATTR_AUTOCOMMIT, true); //commit提交事务后autocommit记得重新设为true return ($stmt->rowCount() !== 0) ? true : false; } function delete($id) { global $app; $db = db(); return ($db->query('DELETE FROM posts WHERE id = '.intval($id))->rowCount() !== 0) ? true : false; } function delete_v2($id) { global $app; $db = db(); $stmt = $db->prepare('DELETE FROM posts WHERE id = ?'); $stmt->bindParam(1, $id, PDO::PARAM_INT); $stmt->execute(); return ($stmt->rowCount() !== 0) ? true : false; } header('Content-Type: text/plain; charset=utf-8'); $sqlite = "CREATE TABLE IF NOT EXISTS posts ( id INTEGER PRIMARY KEY, post_title VARCHAR(255) NOT NULL, post_content TEXT NOT NULL )"; db()->query('DROP TABLE IF EXISTS posts;') or exit(); db()->query($sqlite) or exit(); //并发时,SQLite在insert时因为库文件被其他请求锁住而导致阻塞 echo "var_export(insert('标题1', '内容1'));\n"; var_export(insert('标题1', '内容1')); echo "\n\n"; echo "var_export(insert('标题2', '内容2'));\n"; var_export(insert('标题2', '内容2')); echo "\n\n"; echo "var_export(select());\n"; var_export(select()); echo "\n\n"; echo "var_export(update(2, '标题2_更新','内容2_更新'));\n"; var_export(update(2, '标题2_更新','内容2_更新')); echo "\n\n"; echo "var_export(select(2));\n"; var_export(select(2)); echo "\n\n"; echo "var_export(delete(2));\n"; var_export(delete(2)); echo "\n\n"; echo "var_export(select());\n"; var_export(select()); echo "\n\n";</code>Ich frage mich, ob Sie über eine solche Erfahrung verfügen. PHP ist eigentlich eine Array-orientierte Programmiersprache.
Tatsächlich können Sie erwägen, PHP-Arrays direkt in Dateien zu exportieren, um Daten zu speichern.
<code><?php header('Content-Type: text/plain; charset=utf-8'); $file = __DIR__.'/data.php'; //数据文件,别人直接URL访问也下载不了 if(!file_exists($file)) { file_put_contents($file, '<?php return array();'); //file_put_contents($file, ''); } $fp = fopen($file, 'r+'); //读写方式打开,将文件指针指向文件头 if(flock($fp, LOCK_EX)) { //阻塞到获取排它锁 //锁定数据文件后再进行读写 $arr = require $file; //$arr = unserialize(file_get_contents($file)); $arr[] = date('Y-m-d H:i:s'); ftruncate($fp, 0); //清空文件 fwrite($fp, '<?php return '.var_export($arr, true).';'); //fwrite($fp, serialize($arr)); fflush($fp); //在释放锁之前刷新输出 //sleep(10); //睡眠10秒,在此期间其他工作进程的请求将被阻塞 flock($fp, LOCK_UN); //释放锁定 echo file_get_contents($file)."\n"; } fclose($fp);</code></code>Die Kommentare bieten auch Methoden zum Serialisieren/Unserialisieren von serialisiertem Speicher wie PHP-Sitzungen.
Es ist erwähnenswert, dass die Leistung von Serialize/Unserialize viel besser ist als die von var_export/require.
Aber var_export/ Der Vorteil von require ist, dass es keine Angst vor dem direkten Zugriff durch andere hat, die Datei im Stammverzeichnis ablegen kann und besser lesbar ist.

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

MinGW – Minimalistisches GNU für Windows
Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

Herunterladen der Mac-Version des Atom-Editors
Der beliebteste Open-Source-Editor

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

mPDF
mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),