2012-05-20 13 views
8

मैं वेब सेवा PHP में बना रहा हूं, जो मेरी वेबसाइट अजाक्स कॉल के साथ जानकारी के लिए पूछताछ के लिए उपयोग करेगी।PHP रेड बीन ओआरएम प्रदर्शन समस्या

सबसे पहले मैंने इसे निर्मित php mysql lib के साथ मानक तरीका किया, और सभी क्वेरी मैन्युअल रूप से लिखी और पूरे डेटा मॉडल को MySQL वर्कबेंच और आगे में बनाया। यह बहुत समय लेने वाला था और अगर मुझे डेटा मॉडल बदलना पड़ा तो सब कुछ बहुत जटिल हो जाना शुरू हो गया, इसलिए मैंने PHP ORM देखने का फैसला किया, और मुझे RedBean मिला जो मुझे शुद्ध जादू और खुशी के रूप में लगता है ।

इसके अलावा मैं प्रदर्शन मुद्दों के साथ बहुत अधिक संघर्ष करता हूं। मेरी साइट उपयोगकर्ताओं के लिए टीवी श्रृंखला की अपनी सूची बनाने के लिए एक साइट है। मैं एक सेरी के लिए बाहरी स्रोत से पूछता हूं और इसे अपने डेटाबेस में डालता हूं यदि यह पहले से नहीं है अन्यथा मैं इसे अपने डेटाबेस के से प्राप्त करता हूं।

xml मैं इस बाहरी स्रोत से वापस प्राप्त करता हूं सेरी, सीजन, एपिसोड और इतने पर सूचीबद्ध करता हूं और मैं इसे इस तरह से स्टोर करता हूं।

function InsertSerie($serie) { 
    $serieBean = $this->CreateSerieBean($serie->Series); 
    $genreBeans = $this->CreateGenreBeans($serie->Series->Genre); 
    $actorBeans = $this->CreateActorBeans($serie->Series->Actors); 
    $episodeBeans = array(); 
    foreach ($serie->Episode as $episode) { 
     $episodeBean = $this->CreateEpisodeBean($episode); 
     $seasonBean = $this->CreateSeasonBean($episode); 
     $writerBeans = $this->CreateWriterBeans($episode->Writer); 
     $guestBeans = $this->CreateActorBeans($episode->GuestStars); 
     $directorBeans = $this->CreateDirectorBeans($episode->Director); 
     R::associate($episodeBean, $seasonBean); 
     foreach ($writerBeans as $bean) { 
      R::associate($episodeBean, $bean); 
     } 
     foreach ($guestBeans as $bean) { 
      R::associate($episodeBean, $bean); 
     } 
     foreach ($directorBeans as $bean) { 
      R::associate($episodeBean, $bean); 
     } 
     $episodeBeans[] = $episodeBean; 
    } 
    foreach ($genreBeans as $bean) { 
     R::associate($serieBean, $bean); 
    } 
    foreach ($actorBeans as $bean) { 
     R::associate($serieBean, $bean); 
    } 
    foreach ($episodeBeans as $bean) { 
     R::associate($serieBean, $bean); 
    } 
} 

function CreateGenreBeans($genres) { 
    if(empty($genres)) { return; } 
    $genre = explode("|", $genres); 
$genreBeans = array(); 
foreach ($genre as $g) { 
    if($g != '') { 
      $genreBeans[] = $this->CreateGenreBean($g); 
     } 
    } 
    return $genreBeans; 
} 

function CreateGenreBean($genre) { 
    $bean = R::dispense('genre'); 
    $bean->name = (string)$genre; 
    return $bean; 
} 

function CreateDirectorBeans($directors) { 
    if(empty($directors)) { return; } 
    $director = explode("|", $directors); 
$directorBeans = array(); 
foreach ($director as $d) { 
    if($d != '') { 
      $directorBeans[] = $this->CreateDirectorBean($d); 
     } 
    } 
    return $directorBeans; 
} 

function CreateDirectorBean($director) { 
    $bean = R::dispense('director'); 
    $bean->name = (string)$director; 
    return $bean; 
} 

function CreateActorBeans($actors) { 
    if(empty($actors)) { return; } 
    $actor = explode("|", $actors); 
$actorBeans = array(); 
foreach ($actor as $a) { 
    if($a != '') { 
      $actorBeans[] = $this->CreateActorBean($a); 
     } 
    } 
    return $actorBeans; 
} 

function CreateActorBean($actor) { 
    $bean = R::dispense('actor'); 
    $bean->name = (string)$actor; 
    return $bean; 
} 

function CreateWriterBeans($writers) { 
    if(empty($writers)) { return; } 
    $writer = explode("|", $writers); 
$writerBeans = array(); 
foreach ($writer as $w) { 
    if($w != '') { 
      $writerBeans[] = $this->CreateWriterBean($w); 
     } 
    } 
    return $writerBeans; 
} 

function CreateWriterBean($writer) { 
    $bean = R::dispense('writer'); 
    $bean->name = (string)$writer; 
    return $bean; 
} 

function CreateSerieBean($serie) { 
    $bean = R::dispense('serie'); 
    $bean->serie_id = (string)$serie->id; 
    $bean->airs_day_of_week = (string)$serie->Airs_DayOfWeek; 
    $bean->airs_time = (string)$serie->Airs_Time; 
    $bean->content_rating = (string)$serie->ContentRating; 
    $bean->first_aired = (string)$serie->FirstAired; 
    $bean->imdb_id = (string)$serie->IMDB_ID; 
    $bean->language = (string)$serie->Language; 
    $bean->network = (string)$serie->Network; 
    $bean->overview = (string)$serie->Overview; 
    $bean->rating = (string)$serie->Rating; 
    $bean->rating_count = (string)$serie->RatingCount; 
    $bean->run_time = (string)$serie->Runtime; 
    $bean->serie_name = (string)$serie->SeriesName; 
    $bean->status = (string)$serie->Status; 
    $bean->last_updated = (string)$serie->lastupdated; 
    $bean->thumbnail = (string)$serie->thumbnail; 
    return $bean; 
} 

function CreateSeasonBean($episode) { 
    $bean = R::dispense('season'); 
    $bean->season_id = (string)$episode->seasonid; 
    $bean->season_number = (string)$episode->SeasonNumber; 
    return $bean; 
} 

function CreateEpisodeBean($episode) { 
    $bean = R::dispense('episode'); 
    $bean->episode_id = (string)$episode->id; 
    $bean->episode_name = (string)$episode->EpisodeName; 
    $bean->episode_number = (string)$episode->EpisodeNumber; 
    $bean->first_aired = (string)$episode->FirstAired; 
    $bean->imdb_id = (string)$episode->IMDB_ID; 
    $bean->language = (string)$episode->Language; 
    $bean->overview = (string)$episode->Overview; 
    $bean->rating = (string)$episode->Rating; 
    $bean->rating_count = (string)$episode->RatingCount; 
    $bean->last_updated = (string)$episode->lastupdated; 
    return $bean; 
} 

समस्या यह एक सेरी डालने के लिए लगभग 5 मिनट लगते हैं और साथ ही साथ डुप्लिकेट सम्मिलित करता है, R::freeze(); कर प्रदर्शन या तो मदद नहीं करता है।

प्रश्न: मैं इस मुद्दे को कैसे ठीक कर सकता हूं, मैं रेडबीन को बेहतर प्रदर्शन करने के लिए क्या कर सकता हूं, मैं अपने कोड के साथ बेहतर काम करने के लिए क्या कर सकता हूं, या क्या मुझे बस एक अलग समाधान/दृष्टिकोण ढांचे का उपयोग करना चाहिए। ?

सुझाए गए साझा सूचियों की कोशिश की लेकिन एक ही परिणाम के साथ।

function InsertSerie($serie) { 
    $serieBean = $this->CreateSerieBean($serie->Series); 
    ... 
    foreach ($serie->Episode as $episode) { 
     $episodeBean = $this->CreateEpisodeBean($serieBean ,$episode); 
     ... 
     $this->CreateDirectorBeans($serieBean, $episode->Director); 
     $serieBean->sharedEpisode[] = $episodeBean; 
    } 
    R::store($serieBean); 
} 

function CreateDirectorBeans($bean, $directors) { 
    if(empty($directors)) { return; } 
    $director = explode("|", $directors); 
    foreach ($director as $d) { 
     if($d != '') { 
      $bean->sharedDirector[] = $this->CreateDirectorBean($d); 
     } 
    } 
} 

function CreateDirectorBean($director) { 
    $bean = R::dispense('director'); 
    $bean->name = (string)$director; 
    return $bean; 
} 
    .... 
+3

प्रदर्शन समस्याओं को हल करना प्रोफाइलिंग के साथ शुरू होता है। ऐसा इसलिए है क्योंकि समस्या की समस्या को हल करने का प्रयास करने से थोड़ा समझदारी होती है, इससे पहले कि आपने यह पहचान लिया हो कि समस्या क्या है। आप microtime() या xdebug जैसे टूल का उपयोग कर सकते हैं। – goat

+0

मुझे नहीं पता कि सवाल को और कैसे संकीर्ण करना है:/मुझे लगता है कि मैं रेडबीन का उपयोग कर रहा हूं, यहां एक बड़े बैच या उसके जैसा कुछ लेनदेन करने का गलत तरीका है? – furier

+1

प्रोफाइलिंग का मतलब है कि आपके कोड के कुछ हिस्सों को निष्पादित करने में कितना समय लगता है। इसका उद्देश्य सबसे धीमे हिस्सों की पहचान करना है, क्योंकि अक्सर विशेष रूप से एक चीज होगी जो खड़ी हो जाती है।फिर, आप अपने प्रयासों पर ध्यान केंद्रित कर सकते हैं जहां आप अपने समय के लिए सबसे अधिक इनाम प्राप्त करते हैं। – goat

उत्तर

7

मैं अंत में पता चला 11sec के बारे में 5 मिनट से निष्पादन समय कम करने के लिए कैसे, अभी भी समय की आवंटित लेकिन डेटा की मात्रा पर विचार लेता है और काम करते हैं यह मैं अपनी अच्छी लगता करना है उस हार्डवेयर के लिए।

मैं इन कोड लाइनों

R::Begin(); 
R::associate($bean1, $bean2); 
... 
R::commit(); 

जोड़ा अब यह सब काम बटोरता और काम पैटर्न की इकाई की तरह एक बड़ा लेन-देन में यह प्रदर्शन करती है। इसके अलावा डालने डुप्लिकेट मैं

$bean = R::findOrDispense($type, $sql, $values); 

का उपयोग कर तो मैं सिर्फ सेम लौटने वह पहले से मौजूद है, तो नहीं तो मैं एक नया बना है और इसे वापस करने के लिए स्विच को रोकने के लिए।

0

क्या आपने संबंधों के माध्यम से लूपिंग के बजाय साझा सूचियों का उपयोग करने का प्रयास किया है?

$serieBean->sharedActor[] = $actorBeans; 
$serieBean->sharedEpisode[] = $episodeBeans; 

http://www.redbeanphp.com/manual/shared_lists

+0

केवल सेरी टेबल बनाया गया था और केवल सेरी डेटा डालने के साथ, कोई अन्य टेबल नहीं ... – furier

+0

असल में मैंने गलती की, मैं जल्दी से पढ़ता था और नहीं पढ़ता था कि साझा किया गया एक कीवर्ड है और बाकी की सूची बीन प्रकार से मेल खाना है। अब यह पहले की तरह काम करता है, डुप्लीकेट डालने और इसे सेरी डालने में 5 मिनट लगते हैं। सर्वर पर सीपीयू और राम उपयोग बहुत कम लगता है लेकिन मैं डिस्क काम को नरक की तरह सुन सकता हूं, लेकिन ऐसा नहीं लगता कि यह समस्या है – furier

+0

मैंने काम की इकाई के बारे में कुछ पढ़ा है, जो आपके सभी कामों के लिए एक कंटेनर है और यह एक लेनदेन में सभी एसक्यूएल करता है। http://redbeanphp.com/community/wiki/index.php/Unit_of_Work लेकिन मुझे कोई कोड उदाहरण नहीं मिल रहा है कि एक $ uow ऑब्जेक्ट कैसे प्राप्त करें जिसे मैं जोड़ सकता हूं वर्क(); भी ... – furier

संबंधित मुद्दे