Ukuran memori yang diizinkan dari 33554432 byte habis (mencoba mengalokasikan 43148176 byte) dalam php

279

Pesan kesalahan ini disajikan, ada saran?

Ukuran memori yang diizinkan dari 33554432 byte habis (mencoba mengalokasikan 43148176 byte) dalam php

panidarapu
sumber
5
Tambah batas maksimum memori Anda menjadi 64MB di file php.ini Anda. Pencarian Google Tapi bisakah saya bertanya mengapa Anda mencoba mengalokasikan memori sebanyak itu? Di baris kode mana ia gagal?
1
Apa yang dilakukan skrip saat gagal? bisakah kamu memposting kodenya?
Neil Aitken
3
Sepertinya file txt yang sangat besar.
macbirdie
10
Secara konvensional, Anda membaca file yang berpotensi besar atau ukuran sewenang-wenang satu baris pada satu waktu, menulis lebih banyak memori baris sebelumnya dengan setiap baris membaca. Atau Anda mungkin hanya ingin mengekor atau mengarahkan file untuk mendapatkan entri terbaru. Meningkatkan alokasi memori Anda saat file bertambah bukanlah jawabannya.
ekerner

Jawaban:

319

Akhirnya saya menemukan jawabannya:

Cukup tambahkan baris di bawah ini sebelum baris Anda mendapatkan kesalahan dalam file Anda

ini_set('memory_limit', '-1');

Ini akan mengambil penggunaan server memori yang tidak terbatas, itu berfungsi dengan baik.

Terima kasih telah memberikan saran teman.

panidarapu
sumber
125
Anda masih harus memeriksa mengapa memori habis. Mungkin Anda tidak perlu membaca seluruh file, mungkin membacanya secara berurutan.
macbirdie
8
- @panidarapu dan @Don Jones: Bergantung pada jumlah memori, dan bagaimana skrip ini digunakan, bisa berbahaya untuk mengizinkan perubahan dalam penggunaan memori dengan cara ini. Don, dalam kasus Anda, Anda mungkin dapat memecah umpan menjadi potongan-potongan kecil dan menguraikan apa yang Anda butuhkan. Senang itu berhasil, tapi hati-hati.
pengecut anonim
5
Saran ini bekerja untuk saya. Secara dinamis meningkatkan batas memori dalam skrip dilakukan melalui fungsi ini_set (): ini_set ('memory_limit', '128M');
mente
37
Kawan, tolong jangan pergi untuk perbaikan cepat ini. Ini bisa melukai Anda dalam jangka panjang. Sebagai seorang programmer yang baik, Anda harus mencari tahu alasan di balik konsumsi memori ini & meningkat sesuai kebutuhan alih-alih menjaganya UNLIMITED.
Sumoanand
113
Wow, jawaban besar-besaran yang tervvotifikasi ini sepertinya merupakan praktik yang sangat buruk bagi saya. -1!
Ambidex
59

Berikut adalah dua metode sederhana untuk meningkatkan batas hosting bersama:

  1. Jika Anda memiliki akses ke file PHP.ini Anda, ubah baris dalam PHP.ini Jika baris Anda menunjukkan 32M coba 64M: memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)

  2. Jika Anda tidak memiliki akses ke PHP.ini coba tambahkan ini ke file .htaccess: php_value memory_limit 64M

Haider Abbas
sumber
47

Script Anda menggunakan terlalu banyak memori. Ini sering dapat terjadi dalam PHP jika Anda memiliki loop yang tidak terkendali dan Anda membuat objek atau menambahkan ke array pada setiap lintasan loop.

Periksa loop tak terbatas.

Jika bukan itu masalahnya, coba dan bantu PHP dengan menghancurkan objek yang Anda selesaikan dengan menyetelnya menjadi nol. misalnya.$OldVar = null;

Periksa kode di mana kesalahan sebenarnya terjadi juga. Apakah Anda berharap saluran itu mengalokasikan sejumlah besar memori? Jika tidak, coba dan cari tahu apa yang salah ...

Rik Heywood
sumber
3
Saya punya masalah ini - ternyata saya secara tidak sengaja membuat fungsi rekursif - dan karena itu kehabisan memori kapan saja selama eksekusi kode. Ini memiliki sisi positif saya sekarang memiliki kode yang paling efisien di dunia memori, dibuat dalam perburuan kebocoran memori.
Kris Selbekk
1
Demi orang lain yang akan mengejar kelinci ke lubang. Doktrin di Symfony saya pikir memiliki masalah dengan monolog dan ketika ada pengecualian PDO akan membuat loop pengecualian yang tak terbatas karena akan mencoba pengecualian untuk pengecualian sehingga menyembunyikan masalah sebenarnya (file db rusak dalam kasus saya).
Desislav Kamenov
39

Melakukan:

ini_set('memory_limit', '-1');

tidak pernah baik. Jika Anda ingin membaca file yang sangat besar, ini adalah praktik terbaik untuk menyalinnya sedikit demi sedikit. Coba kode berikut untuk praktik terbaik.

$path = 'path_to_file_.txt';

$file = fopen($path, 'r');
$len = 1024; // 1MB is reasonable for me. You can choose anything though, but do not make it too big
$output = fread( $file, $len );

while (!feof($file)) {
    $output .= fread( $file, $len );
}

fclose($file);

echo 'Output is: ' . $output;
Delali
sumber
6
Tidak percaya semua orang ini merekomendasikan untuk mengatur memory_limit ke -1 ... Hal gila untuk dilakukan pada server produksi. Terima kasih atas solusi yang jauh lebih bersih.
JohnWolf
2
Sementara pada "praktik terbaik", ada baiknya untuk menutup file handler setelah whileloop:fclose($file)
kodeart
2
@assetCorp Bagaimana ini membantu, asalkan file tersebut misalnya 100MiB dan batas memori PHP masih diatur ke 32 MiB. Anda membacanya dengan potongan aman 1MiB, tetapi kemudian menambahkannya ke dalam variabel yang akan menggunakan semua memori yang tersedia setelah loop mencapai 31. iterasi. Bagaimana ini lebih baik? Hanya mengeluarkan bidak yang sama dengan tidak memerlukan menyimpannya semua dalam satu variabel akan membantu menyelesaikan masalah.
Helvete
17

Sayangnya mudah diprogram dalam PHP dengan cara yang menghabiskan memori lebih cepat dari yang Anda sadari. Menyalin string, array dan objek daripada menggunakan referensi akan melakukannya, meskipun PHP 5 seharusnya melakukan ini lebih otomatis daripada di PHP 4. Tetapi berurusan dengan set data Anda secara keseluruhan melalui beberapa langkah juga boros dibandingkan dengan memproses unit logis terkecil. pada suatu waktu. Contoh klasik bekerja dengan hasil yang besar dari database: kebanyakan programmer mengambil seluruh hasil ke dalam array dan kemudian mengulanginya satu atau lebih kali dengan foreach(). Jauh lebih efisien dalam menggunakan while()loop untuk mengambil dan memproses satu baris pada satu waktu. Hal yang sama berlaku untuk memproses file.

ahli statika
sumber
Tampaknya sangat mungkin bahwa inilah yang melakukannya.
Kzqai
13

Jika Anda ingin membaca file besar, Anda harus membacanya sedikit demi sedikit alih-alih membacanya sekaligus.
Ini matematika sederhana: Jika Anda membaca file besar 1 MB sekaligus, maka dibutuhkan setidaknya 1 MB memori pada saat bersamaan untuk menyimpan data.

Jadi, Anda harus membacanya sedikit demi sedikit menggunakan fopen& fread.

Gumbo
sumber
1
Memecahkan ini dengan menggunakan:$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
Kai Noack
12

Saya menghadapi masalah yang sama di php7.2 dengan laravel 5.6. Saya hanya menambah jumlah variabel memory_limit = 128Mdi php.ini sesuai permintaan aplikasi saya. Mungkin 256M / 512M / 1048M ..... Sekarang berfungsi dengan baik.

Ziaur Rahman
sumber
6

Saya juga mengalami masalah yang sama, mencari file phpinfo.ini, php.ini atau .htaccess tidak berhasil. Akhirnya saya melihat beberapa file php, membukanya dan memeriksa kode-kode di dalamnya untuk memori. Akhirnya solusi ini adalah apa yang saya hasilkan dan itu berhasil untuk saya. Saya menggunakan wordpress, jadi solusi ini mungkin hanya berfungsi untuk masalah batas ukuran memori wordpress. Solusi saya, buka file default-constants.php di folder / public_html / wp-include . Buka file itu dengan editor kode, dan temukan pengaturan memori di bawah wp_initial_constantscakupan, atau cukup Ctrl + F untuk menemukan kata "memori". Di sana Anda akan datang WP_MEMORY_LIMITdan WP_MAX_MEMORY_LIMIT. Tingkatkan saja, itu 64 MB dalam kasus saya, saya meningkatkannya menjadi 128 MB dan kemudian menjadi 200 MB.

// Define memory limits.
if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MEMORY_LIMIT', $current_limit );
    } elseif ( is_multisite() ) {
        define( 'WP_MEMORY_LIMIT', '200M' );
    } else {
        define( 'WP_MEMORY_LIMIT', '128M' );
    }
}

if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } elseif ( -1 === $current_limit_int || $current_limit_int > 268435456 /* = 256M */ ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } else {
        define( 'WP_MAX_MEMORY_LIMIT', '256M' );
    }
}

Btw, tolong jangan lakukan kode berikut, karena itu praktik buruk:

ini_set('memory_limit', '-1');
garakchy
sumber
1
Bekerja untuk situs web wordpress, di mana akses tidak tersedia untuk file .htaccess dan php.ini. +1
Mustafa sabir
Saya akan mengatakan bahwa mengubah batas-batas pada file WordPress 'inti' sebenarnya bukan ide yang baik; Anda dapat dengan mudah menambahkan batas itu wp-config.phpsebagai gantinya, di mana mereka tidak akan ditimpa oleh pembaruan WordPress di masa mendatang. Juga, beberapa plugin keamanan (seperti WordFence, misalnya) akan mengeluh jika file WordPress 'inti' diubah ...
Gwyneth Llewelyn
1
@ GwynethLlewelyn Saya tidak tahu bagaimana melakukan itu, bisakah Anda menjelaskannya?
garakchy
1
Oh ... hanya mengedit wp-config.phpdan menambahkan dua baris di sana (i. E. define( 'WP_MEMORY_LIMIT', '200M' );Dan define( 'WP_MAX_MEMORY_LIMIT', '256M' );. Tidak seperti file pada 'core' WP (yaitu, semuanya di bawah wp-includes), yang akan ditimpa oleh upgrade WP, wp-config.phptidak akan - itu ada di sana persis untuk tujuan yang tepat untuk mengesampingkan konstanta WP!
Gwyneth Llewelyn
1
"praktik buruk" bersifat situasional. -1baik untuk proses jangka pendek. Misalnya wadah pembangun php yang digunakan untuk menjalankan pengujian unit atau pemasangan komposer / dll. Hanya saja, jangan menjalankan situs produksi Anda dengan itu diatur seperti itu.
emmdee
5

Anda dapat meningkatkan memori yang diizinkan untuk skrip php dengan mengeksekusi baris berikut di atas semua kode dalam skrip:

ini_set('memory_limit','-1'); // enabled the full memory available.

Dan juga de mengalokasikan variabel yang tidak diinginkan dalam skrip.

Periksa perpustakaan php ini: Membebaskan memori dengan PHP

Sanjay Kumar NS
sumber
4
ini_set('memory_limit', '-1');
Định Nguyễn Thế
sumber
3
@Pang ini_set ('memory_limit', '-1');
DIGITALCRIMINAL
3

Saya perhatikan banyak jawaban hanya mencoba untuk meningkatkan jumlah memori yang diberikan ke skrip yang memiliki tempat tetapi lebih sering itu berarti bahwa ada sesuatu yang terlalu liberal dengan memori karena jumlah volume atau ukuran yang tidak terduga. Jelas jika Anda bukan penulis skrip Anda atas belas kasihan penulis kecuali jika Anda merasa ambisius :) PHP docs bahkan mengatakan masalah memori disebabkan oleh " skrip yang ditulis dengan buruk "

Harus disebutkan bahwa ini_set('memory_limit', '-1');(tanpa batas) dapat menyebabkan ketidakstabilan server 0 bytes free = bad things. Alih-alih, temukan keseimbangan yang masuk akal dengan apa yang coba dilakukan skrip Anda dan jumlah memori yang tersedia pada mesin.

Pendekatan yang lebih baik: Jika Anda adalah penulis skrip (atau ambisius), Anda dapat men-debug masalah memori tersebut dengan xdebug . Versi terbaru (2.6.0 - dirilis 2018-01-29) mengembalikan profil memori yang menunjukkan kepada Anda apa panggilan fungsi yang menghabiskan banyak memori. Itu memperlihatkan masalah dalam skrip yang sulit ditemukan. Biasanya, inefisiensi berada dalam satu lingkaran yang tidak mengharapkan volume yang diterimanya, tetapi setiap kasus akan dibiarkan sebagai latihan untuk pembaca :)

The dokumentasi Xdebug membantu, tapi itu bermuara pada 3 langkah:

  1. Instal - Tersedia melalui apt-getdan yumlain - lain
  2. Mengkonfigurasinya - xdebug.ini: xdebug.profiler_enable = 1,xdebug.profiler_output_dir = /where/ever/
  3. Lihat profil di alat seperti QCacheGrind , KCacheGrind
SeanDowney
sumber
2

Jika Anda mencoba membaca file, itu akan memakan memori dalam PHP. Misalnya, jika Anda mencoba membuka dan membaca file MP3 (seperti, katakanlah, $ data = file (" http://mydomain.com/path/sample.mp3 ") itu akan menarik semuanya ke dalam memori .

Seperti yang disarankan Nelson, Anda dapat bekerja untuk meningkatkan batas memori maksimum jika Anda benar-benar perlu menggunakan memori sebanyak ini.

Beau Simensen
sumber
2

Kami memiliki situasi yang serupa dan kami mencoba memberikan di bagian atas jawaban ini_set ('memory_limit', '-1'); dan semuanya bekerja dengan baik, file gambar terkompresi lebih besar dari 1MB ke KB.

aliran dinamis
sumber
1

Menulis

ini_set('memory_limit', '-1');

di index.php Anda di bagian atas setelah membuka tag php

Prafull
sumber
1

Saya menerima pesan kesalahan yang sama setelah beralih ke tema baru di Wordpress. PHP menjalankan versi 5.3 jadi saya beralih ke 7.2. Itu memperbaiki masalah.

DavGarcia
sumber
1

Jika Anda menggunakan hosting bersama, Anda tidak akan dapat memaksakan kenaikan dalam batas ukuran php.

Cukup buka cpanel Anda dan tingkatkan versi php Anda ke 7.1 dan di atasnya maka Anda bisa melanjutkan.

successtar
sumber
0

pengguna wordpress menambahkan baris:

@ini_set('memory_limit', '-1');

di wp-settings.php yang dapat Anda temukan di folder root diinstal wordpress

Praveesh P
sumber
0

Saya belum memperbarui hosting saya dan database-nya hanya baca. Joomla perlu menulis sesi dan tidak bisa melakukannya.

Alberto M
sumber
0

Saya memiliki masalah yang sama dengan menjalankan php pada command line. Baru-baru ini, saya mengubah file php.ini dan melakukan kesalahan saat mengganti php.ini

Ini untuk php7.0

jalur ke php.ini tempat saya melakukan kesalahan: /etc/php/7.0/cli/php.ini

Saya telah menetapkan memory_limit = 256(yang berarti 256 bytes)
alih-alih memory_limit = 256M(yang berarti 256 Mega bytes).

; Jumlah maksimum memori yang dapat dikonsumsi oleh sebuah skrip (128MB)
; http://php.net/memory-limit
memory_limit = 128M

Setelah saya memperbaikinya, proses saya mulai berjalan dengan baik.

theBuzzyCoder
sumber
0

Jalankan perintah ini di direktori root Magento Anda php -d memory_limit=4G bin/magento

Mohammed Muzammil
sumber
-1

jika Anda menggunakan laravel maka gunakan cara ini

public function getClientsListApi(Request $request){ print_r($request->all()); //for all request print_r($request->name); //for all name }

dari pada

public function getClientsListApi(Request $request){ print_r($request); // it show error as above mention }

Ajay
sumber