سؤال

ما هي أفضل الممارسات حول إنشاء ملف ثابت هياكل قواعد البيانات في PHP?

الكثير أكثر نضجا PHP شقة ملف الأطر أرى أن هناك محاولة لتنفيذ مثل SQL بناء جملة الاستعلام التي هي على أعلى لأغراض بلدي في معظم الحالات (أنا فقط استخدام قاعدة البيانات في هذه النقطة).

هل هناك أي أنيقة الحيل هناك للحصول على أداء جيد و الميزات مع رمز صغير النفقات العامة ؟

هل كانت مفيدة؟

المحلول

حسنا, ما هي طبيعة شقة قواعد البيانات.هل هي كبيرة أو صغيرة.هو بسيط مع المصفوفات المصفوفات ؟ إذا كان شيء بسيط يقول userprofiles بنيت على هذا النحو:

$user = array("name" => "dubayou", 
              "age" => 20,
              "websites" => array("dubayou.com","willwharton.com","codecream.com"),
              "and_one" => "more");

و حفظ أو تحديث db سجل لهذا المستخدم.

$dir = "../userdata/";  //make sure to put it bellow what the server can reach.
file_put_contents($dir.$user['name'],serialize($user));

و لتحميل سجل بالنسبة للمستخدم

function &get_user($name){
    return unserialize(file_get_contents("../userdata/".$name));
}

ولكن مرة أخرى هذا التنفيذ تختلف عن تطبيق الطبيعة من قاعدة البيانات التي تحتاج إليها.

نصائح أخرى

كنت قد تنظر في سكليتي.انها تقريبا بسيطة مثل ملفات مسطحة, ولكن كنت لا تحصل على محرك SQL للاستعلام.ذلك يعمل بشكل جيد مع PHP أيضا.

في رأيي باستخدام "شقة ملف قاعدة البيانات" بالمعنى أنت معنى (والجواب أنك قبلت) ليس neccesarily أفضل طريقة للذهاب نحو الأشياء.أولا وقبل كل شيء ، باستخدام serialize() و unserialize() يمكن أن يسبب الرئيسية الصداع إذا كان شخص ما يحصل في التعديلات الملف (يمكن في الواقع وضع arbritrary رمز في "قاعدة البيانات" ليتم تشغيلها في كل مرة.)

شخصيا, أنا أقول لماذا لا ننظر إلى المستقبل ؟ كانت هناك الكثير من الأوقات التي كانت لدي مشاكل لأن لقد تم إنشاء بلدي "الملكية" ملفات المشروع قد انفجرت إلى نقطة حيث أنه يحتاج إلى قاعدة بيانات ، و أنا أفكر "كنت أتمنى لو كنت قد كتبت هذا على قاعدة أن تبدأ مع" - لأن إعادة بيع ديون رمز يأخذ الكثير من الوقت والجهد.

من هذا تعلمت أن التدقيق في المستقبل طلبي حتى عندما يحصل على أكبر أنا لم يكن لديك للذهاب وقضاء أيام إعادة بيع ديون هو الطريق للذهاب إلى الأمام.كيف يمكنني فعل هذا ؟

سكليتي.وكذلك الأمر في قاعدة البيانات يستخدم SQL, و من السهل جدا على التحول إلى الخلية (espescially إذا كنت تستخدم المستخرجة فئات قاعدة البيانات التلاعب كما أفعل!)

في الواقع ، espescially مع "الإجابة المقبولة"'طريقة ، فإنه يمكن أن يقلل بشكل كبير من استخدام الذاكرة التطبيق الخاص بك (ليس عليك تحميل جميع "السجلات" في PHP)

إطار واحد أنا معتبرا أن يكون منصة التدوين.لأن مجرد عن أي رؤية ممكنة من البيانات التي تريد أن يتم فرزها حسب التاريخ, كنت أفكر في هذا الهيكل:

دليل واحد في محتوى عقدة:

./content/YYYYMMDDHHMMSS/

الدلائل من كل عقدة منها

/tags  
/authors  
/comments  

فضلا عن ملفات نصية بسيطة في عقدة دليل ما قبل وما بعد تقديم المحتوى وما شابه ذلك.

هذا من شأنه أن يسمح بسيطة PHP glob() دعوة (وربما عكس النتيجة مجموعة) إلى الاستعلام عن أي شيء داخل هيكل المحتوى:

glob("content/*/tags/funny");  

سيعود المسارات بما في ذلك جميع المواد الموسومة "مضحك".

هنا هو رمز نستخدمها Lilina:

<?php
/**
 * Handler for persistent data files
 *
 * @author Ryan McCue <cubegames@gmail.com>
 * @package Lilina
 * @version 1.0
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 */

/**
 * Handler for persistent data files
 *
 * @package Lilina
 */
class DataHandler {
    /**
     * Directory to store data.
     *
     * @since 1.0
     *
     * @var string
     */
    protected $directory;

    /**
     * Constructor, duh.
     *
     * @since 1.0
     * @uses $directory Holds the data directory, which the constructor sets.
     *
     * @param string $directory 
     */
    public function __construct($directory = null) {
        if ($directory === null)
            $directory = get_data_dir();

        if (substr($directory, -1) != '/')
            $directory .= '/';

        $this->directory = (string) $directory;
    }

    /**
     * Prepares filename and content for saving
     *
     * @since 1.0
     * @uses $directory
     * @uses put()
     *
     * @param string $filename Filename to save to
     * @param string $content Content to save to cache
     */
    public function save($filename, $content) {
        $file = $this->directory . $filename;

        if(!$this->put($file, $content)) {
            trigger_error(get_class($this) . " error: Couldn't write to $file", E_USER_WARNING);
            return false;
        }

        return true;
    }

    /**
     * Saves data to file
     *
     * @since 1.0
     * @uses $directory
     *
     * @param string $file Filename to save to
     * @param string $data Data to save into $file
     */
    protected function put($file, $data, $mode = false) {
        if(file_exists($file) && file_get_contents($file) === $data) {
            touch($file);
            return true;
        }

        if(!$fp = @fopen($file, 'wb')) {
            return false;
        }

        fwrite($fp, $data);
        fclose($fp);

        $this->chmod($file, $mode);
        return true;

    }

    /**
     * Change the file permissions
     *
     * @since 1.0
     *
     * @param string $file Absolute path to file
     * @param integer $mode Octal mode
     */
    protected function chmod($file, $mode = false){
        if(!$mode)
            $mode = 0644;
        return @chmod($file, $mode);
    }

    /**
     * Returns the content of the cached file if it is still valid
     *
     * @since 1.0
     * @uses $directory
     * @uses check() Check if cache file is still valid
     *
     * @param string $id Unique ID for content type, used to distinguish between different caches
     * @return null|string Content of the cached file if valid, otherwise null
     */
    public function load($filename) {
        return $this->get($this->directory . $filename);
    }

    /**
     * Returns the content of the file
     *
     * @since 1.0
     * @uses $directory
     * @uses check() Check if file is valid
     *
     * @param string $id Filename to load data from
     * @return bool|string Content of the file if valid, otherwise null
     */
    protected function get($filename) {
        if(!$this->check($filename))
            return null;

        return file_get_contents($filename);
    }

    /**
     * Check a file for validity
     *
     * Basically just a fancy alias for file_exists(), made primarily to be
     * overriden.
     *
     * @since 1.0
     * @uses $directory
     *
     * @param string $id Unique ID for content type, used to distinguish between different caches
     * @return bool False if the cache doesn't exist or is invalid, otherwise true
     */
    protected function check($filename){
        return file_exists($filename);
    }

    /**
     * Delete a file
     *
     * @param string $filename Unique ID
     */
    public function delete($filename) {
        return unlink($this->directory . $filename);
    }
}

?>

فإنه يخزن كل إدخال في ملف منفصل ، الذي وجدناه هو فعالة بما فيه الكفاية للاستخدام (أي البيانات غير الضرورية تحميل أسرع إلى الحفظ).

إذا كنت تنوي استخدام ملف ثابت أن تستمر البيانات ، استخدام XML إلى بنية البيانات.PHP لديه المدمج في محلل XML.

كنت قد كتبت اثنين من وظائف بسيطة مصممة لتخزين البيانات في ملف.يمكنك الحكم على نفسك إذا كان من المفيد في هذه الحالة.وهذه النقطة هي أن حفظ php متغير (اذا كان إما صفيف سلسلة أو كائن) إلى ملف.

<?php
function varname(&$var) {
    $oldvalue=$var;
    $var='AAAAB3NzaC1yc2EAAAABIwAAAQEAqytmUAQKMOj24lAjqKJC2Gyqhbhb+DmB9eDDb8+QcFI+QOySUpYDn884rgKB6EAtoFyOZVMA6HlNj0VxMKAGE+sLTJ40rLTcieGRCeHJ/TI37e66OrjxgB+7tngKdvoG5EF9hnoGc4eTMpVUDdpAK3ykqR1FIclgk0whV7cEn/6K4697zgwwb5R2yva/zuTX+xKRqcZvyaF3Ur0Q8T+gvrAX8ktmpE18MjnA5JuGuZFZGFzQbvzCVdN52nu8i003GEFmzp0Ny57pWClKkAy3Q5P5AR2BCUwk8V0iEX3iu7J+b9pv4LRZBQkDujaAtSiAaeG2cjfzL9xIgWPf+J05IQ==';
    foreach($GLOBALS as $var_name => $value) {
        if ($value === 'AAAAB3NzaC1yc2EAAAABIwAAAQEAqytmUAQKMOj24lAjqKJC2Gyqhbhb+DmB9eDDb8+QcFI+QOySUpYDn884rgKB6EAtoFyOZVMA6HlNj0VxMKAGE+sLTJ40rLTcieGRCeHJ/TI37e66OrjxgB+7tngKdvoG5EF9hnoGc4eTMpVUDdpAK3ykqR1FIclgk0whV7cEn/6K4697zgwwb5R2yva/zuTX+xKRqcZvyaF3Ur0Q8T+gvrAX8ktmpE18MjnA5JuGuZFZGFzQbvzCVdN52nu8i003GEFmzp0Ny57pWClKkAy3Q5P5AR2BCUwk8V0iEX3iu7J+b9pv4LRZBQkDujaAtSiAaeG2cjfzL9xIgWPf+J05IQ==')
        {
            $var=$oldvalue;
            return $var_name;
        }
    }
    $var=$oldvalue;
    return false;
}

function putphp(&$var, $file=false)
    {
    $varname=varname($var);
    if(!$file)
    {
        $file=$varname.'.php';
    }
    $pathinfo=pathinfo($file);
    if(file_exists($file))
    {
        if(is_dir($file))
        {
            $file=$pathinfo['dirname'].'/'.$pathinfo['basename'].'/'.$varname.'.php';
        }
    }
    file_put_contents($file,'<?php'."\n\$".$varname.'='.var_export($var, true).";\n");
    return true;
}

إذا كنت ترغب في الإنسان للقراءة النتيجة ، يمكنك أيضا استخدام هذا النوع من الملفات :

ofaurax|27|male|something|
another|24|unknown||
...

وبهذه الطريقة ، يكون لديك ملف واحد فقط, يمكنك تصحيح ذلك (و إصلاح يدويا) بسهولة, يمكنك إضافة حقول في وقت لاحق (في نهاية كل سطر) رمز PHP بسيط (لكل خط تقسيم ووفقا |).

ومع ذلك ، فإن العوائق التي يجب تحليل الملف بأكمله إلى البحث عن شيء (إذا كان لديك الملايين من دخول انها ليست على ما يرام) و يجب التعامل مع فاصل في البيانات (على سبيل المثال إذا كان نيك الحرب|ordz).

هذا واحد هو الملهم باعتباره الحل العملي:
https://github.com/mhgolkar/FlatFire
فإنه يستخدم استراتيجيات متعددة التعامل مع البيانات...
[نسخ من الملف التمهيدي]

مجانا أو تنظيما أو مختلطة

- STRUCTURED
Regular (table, row, column) format.
[DATABASE]
/   \
TX  TableY
    \_____________________________
    |ROW_0 Colum_0 Colum_1 Colum_2|
    |ROW_1 Colum_0 Colum_1 Colum_2|
    |_____________________________|
- FREE
More creative data storing. You can store data in any structure you want for each (free) element, its similar to storing an array with a unique "Id".
[DATABASE]
/   \
EX  ElementY (ID)
    \________________
    |Field_0 Value_0 |
    |Field_1 Value_1 |
    |Field_2 Value_2 |
    |________________|
recall [ID]: get_free("ElementY") --> array([Field_0]=>Value_0,[Field_1]=>Value_1...
- MIXD (Mixed)
Mixed databases can store both free elements and tables.If you add a table to a free db or a free element to a structured db, flat fire will automatically convert FREE or SRCT to MIXD database.
[DATABASE]
/   \
EX  TY

IMHO, لديك خياران إذا كنت ترغب في تجنب homebrewing شيء:

  1. سكليتي

    إذا كنت على دراية مع شركة تنمية نفط عمان, يمكنك تثبيت شركة تنمية نفط عمان تشغيل يدعم سكليتي.لم تستخدم, ولكن لقد استخدمت شركة تنمية نفط عمان طن مع MySQL.أنا ذاهب لإعطاء هذا تسديدة على المشروع الحالي.

  2. XML

    فعلت ذلك عدة مرات للحصول على كميات صغيرة نسبيا من البيانات. XMLReader هي خفيفة الوزن ، قراءة الأمام ، المؤشر-نمط الطبقة. SimpleXML يجعل من السهل قراءة مستند XML إلى كائن التي يمكنك الوصول إليها تماما مثل أي فئة أخرى على سبيل المثال.

فقط أشير إلى مشكلة محتملة مع قاعدة بيانات ملف ثابت مع هذا النوع من النظام:

data|some text|more data

row 2 data|bla hbalh|more data

...الخ

المشكلة هي أن الخلية البيانات يحتوي على "|" أو " " ثم سيتم فقدان البيانات.في بعض الأحيان سيكون من الأسهل إلى تقسيم مجموعات من الحروف أن معظم الناس لن تستخدم.

على سبيل المثال:

العمود الفاصل: #$% (Shift+345)

الصف الفاصل: ^&* (Shift+678)

ملف نصي: test data#$%blah blah#$%^&*new row#$%new row data 2

ثم استخدام: explode("#$%", $data); use foreach, the explode again to separate columns

أو أي شيء على طول هذه الخطوط.كما أود أن أضيف أن شقة ملف قواعد بيانات جيدة للأنظمة مع كميات صغيرة من البيانات (أي.أقل من 20 الصفوف) ، ولكن تصبح ذاكرة ضخمة الخنازير للحصول على أكبر قواعد البيانات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top