اذهب إلى المحتوى

السؤال

نشر

كيفكم يا أصدقاء فيه عندي صفحة جدول php... تحتوي على بيانات قرابة ال 30 الف.... وعملت تحميل بيانات إلى الأكسل هل هذا الكود قادر على تحميل هذه البيانات الكثيره ام ستحدث مشكله 

<?php
include('con.php');
if (isset($_POST['Re'])) {
    $Re = $_POST['Re'];

    $sql = "SELECT * FROM iP WHERE Re = '$Re'";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        $filename = "data_from_iP_$Re.csv";
        header('Content-Type:text/csv; charset=utf-8');
        header('Content-Disposition: attachment; filename=' . $filename);
        $output = fopen('php://output', 'w');
           fprintf($output, "\xEF\xBB\xBF");
        $header = ['الاسم','الاسم الاول'];
        fputcsv($output, $header);
        while ($row = $result->fetch_assoc()) {
            fputcsv($output, $row);
        }

        fclose($output);
        exit();
    } else {
        echo "No data found for this disease type.";
    }
}

$conn->close();
?>

 

Recommended Posts

  • 0
نشر

الكود الذي كتبته يمكنه تصدير البيانات من قاعدة البيانات إلى ملف CSV بنجاح، ولكن مع وجود 30 ألف سجل،سيحدث بعض المشاكل مثل:

1. استهلاك الذاكرة:

عندما تتعامل مع عدد كبير من السجلات مثل 30 ألف سجل، قد يتسبب ذلك في استهلاك كمية كبيرة من الذاكرة، خاصة إذا كان الخادم يستخدم إعدادات ذاكرة محدودة. يمكن أن يؤدي هذا إلى توقف السكريبت عن العمل إذا تجاوزت حدود الذاكرة المسموح بها في PHP.

2. وقت التنفيذ:

إذا استغرق السكريبت وقتًا طويلاً لتنفيذ جميع العمليات، قد يصل إلى الحد الزمني المسموح به (max_execution_time) في إعدادات PHP، مما يؤدي إلى توقف السكريبت.

3. تحسين الكود:

لتجنب هذه المشكلات، يمكنك تحسين الكود بعدة طرق:

زيادة الذاكرة المتاحة في إعدادات PHP باستخدام ini_set('memory_limit', '512M'); أو قيمة مناسبة أخرى.

زيادة وقت التنفيذ المسموح به باستخدام ini_set('max_execution_time', 300); أو قيمة مناسبة أخرى.

استخدام LIMIT و OFFSET في استعلام SQL لتقسيم العملية إلى أجزاء أصغر.

مثال علي الكود بعد تحسينه 
 

<?php
include('con.php');

if (isset($_POST['Re'])) {
    $Re = $_POST['Re'];
    ini_set('memory_limit', '512M'); // زيادة حد الذاكرة
    ini_set('max_execution_time', 300); // زيادة الحد الأقصى لوقت التنفيذ

    $sql = "SELECT * FROM iP WHERE Re = '$Re'";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        $filename = "data_from_iP_$Re.csv";
        header('Content-Type: text/csv; charset=utf-8');
        header('Content-Disposition: attachment; filename=' . $filename);
        $output = fopen('php://output', 'w');
        fprintf($output, "\xEF\xBB\xBF"); // لإضافة ترميز UTF-8 في بداية الملف

        // كتابة رأسية الجدول
        $header = ['الاسم', 'الاسم الاول'];
        fputcsv($output, $header);

        // كتابة البيانات
        while ($row = $result->fetch_assoc()) {
            fputcsv($output, $row);
        }

        fclose($output);
        exit();
    } else {
        echo "No data found for this disease type.";
    }
}

$conn->close();
?>

 

  • 0
نشر
بتاريخ 3 ساعة قال Taha Khalid:

الكود الذي كتبته يمكنه تصدير البيانات من قاعدة البيانات إلى ملف CSV بنجاح، ولكن مع وجود 30 ألف سجل،سيحدث بعض المشاكل مثل:

1. استهلاك الذاكرة:

عندما تتعامل مع عدد كبير من السجلات مثل 30 ألف سجل، قد يتسبب ذلك في استهلاك كمية كبيرة من الذاكرة، خاصة إذا كان الخادم يستخدم إعدادات ذاكرة محدودة. يمكن أن يؤدي هذا إلى توقف السكريبت عن العمل إذا تجاوزت حدود الذاكرة المسموح بها في PHP.

2. وقت التنفيذ:

إذا استغرق السكريبت وقتًا طويلاً لتنفيذ جميع العمليات، قد يصل إلى الحد الزمني المسموح به (max_execution_time) في إعدادات PHP، مما يؤدي إلى توقف السكريبت.

3. تحسين الكود:

لتجنب هذه المشكلات، يمكنك تحسين الكود بعدة طرق:

زيادة الذاكرة المتاحة في إعدادات PHP باستخدام ini_set('memory_limit', '512M'); أو قيمة مناسبة أخرى.

زيادة وقت التنفيذ المسموح به باستخدام ini_set('max_execution_time', 300); أو قيمة مناسبة أخرى.

استخدام LIMIT و OFFSET في استعلام SQL لتقسيم العملية إلى أجزاء أصغر.

مثال علي الكود بعد تحسينه 
 

<?php
include('con.php');

if (isset($_POST['Re'])) {
    $Re = $_POST['Re'];
    ini_set('memory_limit', '512M'); // زيادة حد الذاكرة
    ini_set('max_execution_time', 300); // زيادة الحد الأقصى لوقت التنفيذ

    $sql = "SELECT * FROM iP WHERE Re = '$Re'";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        $filename = "data_from_iP_$Re.csv";
        header('Content-Type: text/csv; charset=utf-8');
        header('Content-Disposition: attachment; filename=' . $filename);
        $output = fopen('php://output', 'w');
        fprintf($output, "\xEF\xBB\xBF"); // لإضافة ترميز UTF-8 في بداية الملف

        // كتابة رأسية الجدول
        $header = ['الاسم', 'الاسم الاول'];
        fputcsv($output, $header);

        // كتابة البيانات
        while ($row = $result->fetch_assoc()) {
            fputcsv($output, $row);
        }

        fclose($output);
        exit();
    } else {
        echo "No data found for this disease type.";
    }
}

$conn->close();
?>

 

اذا كان جهاز الحاسوب ذات مواصفات عاليه جدآ 

  • 0
نشر
بتاريخ 12 ساعة قال Omer Amad:

اذا كان جهاز الحاسوب ذات مواصفات عاليه جدآ 

الأمر لا يتطلب مواصفات مرتفعة، ستحتاج إلى 100 ميجابايت لتحميل 10 آلاف سجل و 500 ميجابايت لتحميل 30 ألف سجل.

لذا لتجنب أية مشاكل محتملة،  فبدلاً من تحميل جميع البيانات دفعة واحدة، قم بتقسيمها إلى دفعات أصغر (مثلاً 1000 صف لكل دفعة) وتحميل كل دفعة على حدة، حيث سنستخدم عبارة LIMIT في استعلام SQL لجلب 1000 صف في كل مرة وسنحتاج أيضًا إلى معرفة عدد المرات التي يجب أن نكرر فيها الاستعلام، لذلك سنقوم أولاً بحساب عدد الصفوف الكلي.

$Re = $_POST['Re'];

$countSql = "SELECT COUNT(*) as total FROM iP WHERE Re = '$Re'";
$countResult = $conn->query($countSql);
$totalRows = $countResult->fetch_assoc()['total'];

$batchSize = 1000;
$numBatches = ceil($totalRows / $batchSize); 

ونستخدم حلقة for للتكرار على عدد الدفعات المحسوبة، في كل تكرار، سنقوم بتعديل استعلام SQL لجلب الدفعة الحالية فقط.

for ($i = 0; $i < $numBatches; $i++) {
    $offset = $i * $batchSize; 

    $sql = "SELECT * FROM iP WHERE Re = '$Re' LIMIT $offset, $batchSize";
    $result = $conn->query($sql);

}

 

  • 0
نشر
بتاريخ 50 دقائق مضت قال Mustafa Suleiman:

الأمر لا يتطلب مواصفات مرتفعة، ستحتاج إلى 100 ميجابايت لتحميل 10 آلاف سجل و 500 ميجابايت لتحميل 30 ألف سجل.

لذا لتجنب أية مشاكل محتملة،  فبدلاً من تحميل جميع البيانات دفعة واحدة، قم بتقسيمها إلى دفعات أصغر (مثلاً 1000 صف لكل دفعة) وتحميل كل دفعة على حدة، حيث سنستخدم عبارة LIMIT في استعلام SQL لجلب 1000 صف في كل مرة وسنحتاج أيضًا إلى معرفة عدد المرات التي يجب أن نكرر فيها الاستعلام، لذلك سنقوم أولاً بحساب عدد الصفوف الكلي.

$Re = $_POST['Re'];

$countSql = "SELECT COUNT(*) as total FROM iP WHERE Re = '$Re'";
$countResult = $conn->query($countSql);
$totalRows = $countResult->fetch_assoc()['total'];

$batchSize = 1000;
$numBatches = ceil($totalRows / $batchSize); 

ونستخدم حلقة for للتكرار على عدد الدفعات المحسوبة، في كل تكرار، سنقوم بتعديل استعلام SQL لجلب الدفعة الحالية فقط.

for ($i = 0; $i < $numBatches; $i++) {
    $offset = $i * $batchSize; 

    $sql = "SELECT * FROM iP WHERE Re = '$Re' LIMIT $offset, $batchSize";
    $result = $conn->query($sql);

}

 

انا عامل جداول تعرض البيانات على اساس نوع المرض مثلاً المصابين في مرض الكوليرا 5000 شخص سيتم تحميل فقط 5000.... وباقي المصابين حسب نوع المرض هل هذا العمل صحيح؟! 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...