bu sunucu konfigürasyonu bir sorun, belki bir bash betiği çağırdığında php script ölür

2 Cevap php

Ben PHP komut dosyası, bir XML dosyası yükledi sonra PHP komut dosyası (örneğin, bir XML dosyası yüklenir porsiyonlarda dosyası kesmek için bir Bash komut dosyası çağırır .... bir Bash komut dosyasını çağıran bir PHP komut dosyası ile bazı sorunlar var 30000 hatlarının, yani en Bash komut 10000 hatlarının parçalar halinde kesilmiş dosyasını, bu nedenle) her biri 10,000 3 içerik olacaktır

Dosya yüklenirse, Bash script hatları kesilmiş, ancak Bash script PHP komut döndüğünde, PHP komut dosyası ölür, & Ben neden ... Ben başka bir sunucu komut test bilmiyorum ve ben ne can, ne yapacağımı bilmiyorum, bilmiyorum, belki bu da bir işlemci sorun, bir bellek sorunu olduğunu inanmıyorum ... çalışıyor yapmam?? (Im Bash komut aramak için PHP fonksiyon shell_exec kullanarak)

XML dosyası 8000'den fazla satır varsa hata sadece olur, ancak dosya az sonra 8.000 varsa her şey (bu her satırı içeren harf dizeleri veri miktarı, bağlıdır, görecelidir) ok

what can you suggest me??? (sorry for my bad english, I have to practice a lot xD) I leave the code here

PHP komut dosyası (sonra sonunda,?>, Html ve javascript kodu var, ama sadece javascript kodu ... temelde html dosya yüklemek için sadece, görünmez)


" . date('c') . ": $str
"; $file = fopen("uploadxmltest.debug.txt","a"); fwrite($file,date('c') . ": $str\n"); fclose($file); } try{ if(is_uploaded_file($_FILES['tfile']['tmp_name'])){ debug("step 1: the file was uploaded"); $norg=date('y-m-d')."_".md5(microtime()); $nfle="testfiles/$norg.xml"; $ndir="testfiles/$norg"; $ndir2="testfiles/$norg"; if(move_uploaded_file($_FILES['tfile']['tmp_name'],"$nfle")){ debug("step 2: the file was moved to the directory"); debug("memory_get_usage(): " . memory_get_usage()); debug("memory_get_usage(true): " . memory_get_usage(true)); debug("memory_get_peak_usage(): " . memory_get_peak_usage()); debug("memory_get_peak_usage(true): " . memory_get_peak_usage(true)); $shll=shell_exec("./crm_cutfile_v2.sh \"$nfle\" \"$ndir\" \"$norg\" "); debug("result: $shll"); debug("memory_get_usage(): " . memory_get_usage()); debug("memory_get_usage(true): " . memory_get_usage(true)); debug("memory_get_peak_usage(): " . memory_get_peak_usage()); debug("memory_get_peak_usage(true): " . memory_get_peak_usage(true)); debug("step 3: the file was cutted.
END"); } else{ debug("ERROR: I didnt move the file"); exit(); } } else{ debug("ERROR: I didnt upload the file"); //exit(); } } catch(Exception $e){ debug("Exception: " . $e->getMessage()); exit(); } ?> Test function uploadFile(){ alert("start"); if(document.test.tfile.value==""){ alert("First you have to upload a file"); } else{ document.test.submit(); } }

AWK ile betik


#!/bin/bash

#For single messages (one message per contact)
function cutfile(){
 lines=$( cat "$1" | awk 'END {print NR}' )
 fline="$4";

 if [ -d "$2" ]; then
  exsts=1
 else
  mkdir "$2"
 fi

 cp "$1" "$2/datasource.xml"
 cd "$2"

 i=1
 contfile=1
 while [ $i -le $lines ]
 do 
  currentline=$( cat "datasource.xml" | awk -v fl=$i 'NR==fl {print $0}' )

  #creates first file
  if [ $i -eq 1 ]; then
   echo "$fline" >>"$3_1.txt"
  else
   #creates the rest of files when there are more than 10,000 contacts
   rsd=$(( ( $i - 2 ) % 10000 ))
   if [ $rsd -eq 0 ]; then
    echo "" >>"$3_$contfile.txt"
    contfile=$(( $contfile + 1 ))
    echo "$fline" >>"$3_$contfile.txt"
   fi
  fi

  echo "$currentline" >>"$3_$contfile.txt"
  i=$(( $i + 1 )) 
 done

 echo "" >>"$3_$contfile.txt"
 return 1
}


#For multiple messages (one message for all contacts)
function cutfile_multi(){
 return 1
}

cutfile "$1" "$2" "$3" "$4"
echo 1

teşekkürler!! = D

2 Cevap

Muhtemelen split yarar yerine çoğu veya Bash komut tüm kullanmalısınız.


Bunlar kod bazı yorumlar vardır. Bu gerçekten büyük bir revizyon ihtiyacı vardır.

Bir dosyadaki satır sayısını almak için:

lines=$( wc -l < "$1" )

Sen değişkeni asla kullanmayın exsts. Neden sadece yapamaz:

if [ ! -d "$2" ]; then
    mkdir "$2"
fi

Dosyasındaki her satır için ayrı ayrı awk çağrılması son derece yavaştır. Işin tamamı veya çoğu yapmak ya da bir while döngü kullanarak dosya hatları üzerinden yineleme bir AWK komut dosyası kullanabilirsiniz Ya:

while read -r currentline
do
    process_line    # this represents what needs to be done to each line
done < datasource.xml

Bash Eğer böyle bir tamsayı değişkeni artırmak:

(( contfile++ ))
(( i++ ))

Sizin PHP script sadece üç argümanla Bash komut çağırıyor. Bunun dışında ben gerçekten PHP script bakmadı.


Cidden, kullanın split. Bu kadar basit:

split --lines 10000 --numeric-suffixes --suffix-length 4 datasource.xml "$3_"
for file in "$3_*"
do
    echo "$fline" | cat - "$file" > "$file.txt" && rm "$file"
done

İşte (esas sorun hakkında daha fazla özelliklerini bilmek) bakmak istiyorum bazı şeyler şunlardır:

  • Farklı bash komut, hiçbir şey yapmaz biri ve büyük boyutta bir dosya böler birini kullanmayı deneyin. PHP komut dosyası bir veya her iki durumda ölecek mi?
  • Sunucularda izinlerini denetleyin. Uygun izinleri verilmiş olan komut ve dosyalar nelerdir? (Küçük dosyalar Tamam işe neden bu açıklamaya değil ama.)
  • PHP ve web sunucusu hata günlüklerini denetleyin. Bu hata çok tarayıcı penceresinde daha orada görünen olduğunu olabilir. (Ve eğer öyleyse, ek yardım için soru ile yer alıyor.)
  • Bu hafıza ile ilgili gibi görünüyor çünkü ben hata yükleme sırasında meydana inanıyorum bile, betik çağrısından önce, yüklemeler için bellek kullanımı ile anlaşma PHP ayarlarını artan deneyebilirsiniz.

Ben daha spesifik fikirler sunamıyoruz üzgünüm, bu yardım umuyoruz.