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

السؤال

نشر

كيفكم يا أصدقاء فيه عندي صفحة جدول 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
نشر
  بتاريخ On 15‏/8‏/2024 at 22:40 قال 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
نشر
  بتاريخ On 16‏/8‏/2024 at 01:42 قال 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
نشر
  بتاريخ On 16‏/8‏/2024 at 14:11 قال 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...