error

levmoshe

New member
error

בserver הפנימי של המחשב (wamp) האפליקציה עובדת ללא בעיות.
בserver החיצוני החי לאחר שהעלתי את האפלקציה לאתר מתקבלת השגיעה הנ"ל:

Fatal error: Allowed memory size of 25165824 bytes exhausted (tried to allocate 10747884 bytes) in /hsphere/local/home/moshe/salescenter.co.il/cart.php on line 137
אשמח לשמוע ולהבין את פשר השגיעה.

תודה,
משה.
 

levmoshe

New member
קוד

זה חלק מקוד מוכן ששילבתי בקוד שלי.ליצירת אתר מסחרי.
 
ישנה מגבלה על כמות הזיכרון שסקריפט יכול לקבל

הסקריפט שלך בשלב כלשהו מנסה להקצות לעצמו יותר מ25 מגהבייט שזו המגבלה בשרת אירוח (שזה לא מעט)
בשרת במחשב המקומי שלך המגבלה כנראה יותר גדולה מבשרת אירוח, או שבשרת אירוח אתה עושה משהו שגורם לסקריפט לצרוך יותר זיכרון

קודם כל, תוודא שהצריכת זיכרון הזו נורמאלית, הסקריפט מנסה להקצות 10 מגהבייט בשורה אחת, זה המון.
אם זה צפוי,
יתכן שאתה יכול להעלות את המגבלה הזו בעצמך באמצעות ini_set() או קובץ htaccess או מה שזמין בשרת שלך
http://www.php.net/manual/en/ini.core.php#ini.memory-limit

אם לא, תפנה לחברת אחסון שלך לראות אם הם יסכימו למרות שבכל מקרה יש לי הרגשה שהם לא יאהבו את הצריכת זיכרון הזו
 

levmoshe

New member
תודה בניה פרץ

ניסיתי להוריד את הזיכרון ב php.ini ל 4M .+ restart באפצי והסקריפט עדיין עבד בserver הפנימי.
אז כניראה זאת לא הבעייה.

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 128M
 
זו הבעיה כי זה מה שכתוב בשגיאה.

מה גורם לה זה רק מי שרואה את הקוד יכול לדעת

* ותריץ PHPINFO כדי לוודא שהשרת המקומי שלך באמת קיבל את הגדרת הMEMORY הנמוכה יותר.
 

levmoshe

New member
פרוט הבעייה

בדקתי ב phpinfo()
לאחר שהורדתי מ128M ל4M .היה שינוי ל4M. אבל הקוד עבד
בשרת הרחוק אכן יש הגבלה ל 24M אבל בהתחשב בכך שבשרת המקומי הקוד עובד על פחות,זאת כניראה לא הבעייה.
צרפתי את הקוד. השגיאה מצביעה על השורה הנ"ל:

array_splice($_SESSION["cart_array"], $i-1, 1, array(array("item_id" => $pid, "quantity" => $each_item['quantity

וכל זה קורה כאשר אני מוסיף מוצר לסל הקניות בסדר הבא:
מוסיף מוצר א.
מוסיף מוצר ב
ורק לאחר חזרה להוספת מוצר שכבר הוספתי אותו לאחר הוספת מוצר אחר, בדוגמה זאת מוצר א,
נוצר freezing באתר ולאחר מכן מופיעה השגיאה.
בכל סדר אחר של הוספת מוצר לא קיימת הבעייה. וכל זה קורה רק בserver החיצוני.




Section 1 (if user attempts to add something to the cart from the product page
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (isset($_POST['pid'])) {
$pid = $_POST['pid'];
$wasFound = false;
$i = 0;
// If the cart session variable is not set or cart array is empty
if (!isset($_SESSION["cart_array"]) || count($_SESSION["cart_array"]) < 1) {
// RUN IF THE CART IS EMPTY OR NOT SET
$_SESSION["cart_array"] = array(0 => array("item_id" => $pid, "quantity" => 1));
} else {
// RUN IF THE CART HAS AT LEAST ONE ITEM IN IT
foreach ($_SESSION["cart_array"] as $each_item) {
$i++;
while (list($key, $value) = each($each_item)) {
if ($key == "item_id" && $value == $pid) {
// That item is in cart already so let's adjust its quantity using array_splice()
array_splice($_SESSION["cart_array"], $i-1, 1, array(array("item_id" => $pid, "quantity" => $each_item['quantity'] + 1)));
$wasFound = true;
} // close if condition
} // close while loop
} // close foreach loop
if ($wasFound == false) {
array_push($_SESSION["cart_array"], array("item_id" => $pid, "quantity" => 1));
}
}
header("location: cart.php");
exit();
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Section 2 (if user chooses to empty their shopping cart)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (isset($_GET['cmd']) && $_GET['cmd'] == "emptycart") {
unset($_SESSION["cart_array"]);
}
 
הקוד לא קריא בצורה הזו

לפחות שיהיה מיושר לשמאל, או שיעבוא בקובץ מצורף או ב PASTEBIN
http://pastebin.com/

אתה צריך להבין שהשגיאה השאתה רואה ***אומרת בפירוש*** שהסקריפט חרג ממגבלת זיכרון.אני מניח שאתה יודע לקרוא את זה לבד.

כנראה המערכים המדוברים מאוד גדולים:

array_splice($_SESSION["cart_array"], $i-1, 1, array(array("item_id" => $pid, "quantity" => $each_item['quantity

אם הוא מנסה להקצות מגהבייט RAM בשביל זה ועובר על הדרך 24 מגה
תנסה לחשוב אם יש לך משתנה מנופח, תעשה VAR_DUMP כדי להבין איזה גודל המשתנים שלך, ותריץ גם memory_get_usage בכל מיני מקומות כדי להבין איפה הזיכרון מתנפח
http://il.php.net/manual/en/function.memory-get-usage.php
 

levmoshe

New member
צרפתי קובץ כדי שיהיה קריא.

שהקובץ חורג ממגבלות הזיכרון הבנתי.
מה שלא הבנתי זה ,שלמרות שהקטנתי ב php.ini את הזיכרון מ128M ל 4M ,ב SERVER של המחשב,
הקוד כן עובד.
לעומת זאת הזיכרון ב SERVER החיצוני 24M ושם והקוד לא עובד.
 
כטקסט בבקשה

תמונה זה כדי לתלות על קיר
 
רק אצלך הקוד רץ

אז רק אתה יכול לדבג אותו ולהבין איזה משתנה מנופח שם בעזרת VAR_DUMP.
 
למעלה