Jump to content

How to make a function start, without waiting the previous one to end..


Oguzz13

Recommended Posts

Hi,

 

In the below code, each PdfGen2, 3, 4.. function starts only after the previous one ends.. And the result of the previous function comes in 3-4 seconds (it posts some info to a plugin and receives some info back), so it delays a lot when it comes to the 7th or 8th function.

 

How can I make the functions to start at the same time and doesn't require to wait each other to finish their own functions.

 

#Explanation.. This is where the code checks if there is more than 1 pdf. If there is, it sends it to different functions (PdfGen2, PdfGen3..)
but the problem is it waits to previous function to be finished and return the necessary stamped new pdf's url. The new function only works
after that and each time it takes 2-3 seconds to do that.

if ($tarih_sql == true)
{
$urun_id = $db->VeriCek($Id, 'siparisler', 'urun_id');

$pdf_url = $ykd->PdfGen($Id);

$urun_pdf_url2 = $db->VeriCek($urun_id, 'urunler', 'pdf_url2');
if ($urun_pdf_url2 != '') { $pdf_url2 = $ykd->PdfGen2($Id, '0', '2'); $pdf_url_sql .= ", pdf_url2='$pdf_url2'"; }

$urun_pdf_url3 = $db->VeriCek($urun_id, 'urunler', 'pdf_url3');
if ($urun_pdf_url3 != '') { $pdf_url3 = $ykd->PdfGen3($Id, '0', '3'); $pdf_url_sql .= ", pdf_url3='$pdf_url3'"; }

$urun_pdf_url4 = $db->VeriCek($urun_id, 'urunler', 'pdf_url4');
if ($urun_pdf_url4 != '') { $pdf_url4 = $ykd->PdfGen4($Id, '0', '4'); $pdf_url_sql .= ", pdf_url4='$pdf_url4'"; }

$urun_pdf_url5 = $db->VeriCek($urun_id, 'urunler', 'pdf_url5');
if ($urun_pdf_url5 != '') { $pdf_url5 = $ykd->PdfGen5($Id, '0', '5'); $pdf_url_sql .= ", pdf_url5='$pdf_url5'"; }

$urun_pdf_url6 = $db->VeriCek($urun_id, 'urunler', 'pdf_url6');
if ($urun_pdf_url6 != '') { $pdf_url6 = $ykd->PdfGen6($Id, '0', '6'); $pdf_url_sql .= ", pdf_url6='$pdf_url6'"; }

$urun_pdf_url7 = $db->VeriCek($urun_id, 'urunler', 'pdf_url7');
if ($urun_pdf_url7 != '') { $pdf_url7 = $ykd->PdfGen7($Id, '0', '7'); $pdf_url_sql .= ", pdf_url7='$pdf_url7'"; }

$urun_pdf_url8 = $db->VeriCek($urun_id, 'urunler', 'pdf_url8');
if ($urun_pdf_url8 != '') { $pdf_url8 = $ykd->PdfGen8($Id, '0', '8'); $pdf_url_sql .= ", pdf_url8='$pdf_url8'"; }

$urun_pdf_url9 = $db->VeriCek($urun_id, 'urunler', 'pdf_url9');
if ($urun_pdf_url9 != '') { $pdf_url9 = $ykd->PdfGen9($Id, '0', '9'); $pdf_url_sql .= ", pdf_url9='$pdf_url9'"; }

$urun_pdf_url10 = $db->VeriCek($urun_id, 'urunler', 'pdf_url10');
if ($urun_pdf_url10 != '') { $pdf_url10 = $ykd->PdfGen10($Id, '0', '10'); $pdf_url_sql .= ", pdf_url10='$pdf_url10'"; }

$urun_pdf_url11 = $db->VeriCek($urun_id, 'urunler', 'pdf_url11');
if ($urun_pdf_url11 != '') { $pdf_url11 = $ykd->PdfGen11($Id, '0', '11'); $pdf_url_sql .= ", pdf_url11='$pdf_url11'"; }

$urun_pdf_url12 = $db->VeriCek($urun_id, 'urunler', 'pdf_url12');
if ($urun_pdf_url12 != '') { $pdf_url12 = $ykd->PdfGen12($Id, '0', '12'); $pdf_url_sql .= ", pdf_url12='$pdf_url12'"; }

$urun_pdf_url13 = $db->VeriCek($urun_id, 'urunler', 'pdf_url13');
if ($urun_pdf_url13 != '') { $pdf_url13 = $ykd->PdfGen13($Id, '0', '13'); $pdf_url_sql .= ", pdf_url13='$pdf_url13'"; }

$guncelle = $db->Sorgu("Update siparisler Set pdf_url='$pdf_url' $pdf_url_sql Where id='$Id' Limit 1");

$eposta = $db->VeriCek($Id, 'siparisler', 'eposta');
$essiz_id = $db->VeriCek($Id, 'siparisler', 'essiz_id');
$urun_adi = $db->VeriCek($urun_id, 'urunler', 'baslik');
$destek_mail = $db->VeriCek($urun_id, 'urunler', 'destek_mail');

$indir_link = _SiteDomain_.'indir/'.$Id.'/'.$essiz_id.'/';

$mail_kime = $eposta;
$mail_kimden = $destek_mail;
$mail_konu = 'İndirme Bağlantınız';
$mail_mesaj = '
Alttaki Bağlantıya Tıklayıp Dosyanızı İndirebilirsiniz.<br /><br />

Bağlantı:<br />
<a href="'.$indir_link.'">'.$indir_link.'</a>
<br /><br />

Bize '.$destek_mail.' mail adresinden ulaşabilirsiniz.
<br /><br />

<b>'.$urun_adi.' Yönetimi</b>
';

$mail->Gonder($mail_kime, $mail_konu, $mail_mesaj, $mail_kimden);
}

Edited by Oguzz13
Link to comment
Share on other sites

I've found sth named "parallel threading" and "async php".. as far as I've understood they make the function to run in the background.

 

How can I change the code above, so that each function starts and runs in the background without waiting another one to end?

Link to comment
Share on other sites

I've found sth named "parallel threading" and "async php".. as far as I've understood they make the function to run in the background.

 

How can I change the code above, so that each function starts and runs in the background without waiting another one to end?

 

Read up on how to do it and then implement it! 

Link to comment
Share on other sites

PHP does not do asynchronous code. If you want to add that the complexity of this script will skyrocket.

 

It looks like your database is very much not normalized. Are you able to change the schema?

 

I cut and pasted the code sample, that because of that I think..

Link to comment
Share on other sites

I've found sth named "parallel threading" and "async php".. as far as I've understood they make the function to run in the background.

 

How can I change the code above, so that each function starts and runs in the background without waiting another one to end?

Functions do not run in the background. You can run an entire script in the background but then you have to manage the various instances of the scripts and get them to communicate with each other.

Link to comment
Share on other sites

In order of importance,

1. You really, really need to decide if the running time is a problem. Is this something that can run via cron instead? Can you send the email first and do the updates second?

2. Why are there 13 fields for the "pdf_url"? That screams of a poor database design and I bet you fixing that would eliminate the time problem.

3. Is this script running from a web page or the command line? It dictates what method(s) to use to run a script in the background.

4. Can the 13 potential updates be run independently of each other? Seems like it.

5. Assuming $db->VeriCek() does nothing more complicated than a SELECT you can probably run all these updates, either together or individually, with a single query. No PHP code required.

Link to comment
Share on other sites

This is a part of my shopping card written in PHP which is designed to sell pdf's.

 

And there is a wordpress plugin installed in another site, which stamps pdf's with customer details.

 

The shopping card posts the customer info's to the plug-in for each pdf. In the "if statements" above it checks whether there is another pdf file or not. We sell multiple pdf's together.

 

Althuogh all pdf's are sent to different plug-in's and has nothing to do with order, because of the code above, it waits the first pdf to be stamped (about 3-4 seconds) in the first plug-in and then moves to the next one.

 

I need to stamp at least 8 pdf's like this and it makes about 25-30 seconds after a purchase, which is a little bit long.

 

That's why I want to make these functions to work at the same time, so that all the pdf info's can be send to the plug-in's simultanously, and be stamped at total 3-4 seconds.. Instead of 25-30 seconds..

 

Because customer is redirected to the download page after a succesfull purchase.. 25-30 seconds waiting is a little long for a credit card purchase.

 

The system runs in a Linux server and we can make necessary changes if there are any.

Link to comment
Share on other sites

I've opened a freelancer job in the forum about this issue.

 

If you believe that you can convert this code to work without waiting each other (implementing multi-threading or any other way..), please free to contact with me via PM or oguzhrsn@gmail.com

 

Thanks.

Link to comment
Share on other sites

pcntl_fork() is an option for forking your php, however it's not usually compiled with most installs, so you'll have to make sure you can even use it. In the event you have access to pcntl_fork() you can in fact spawn an exact copy of the current process as a child process and run code in parallel. However, It's not recommended for use in a web server environment.
Link to comment
Share on other sites

pcntl_fork() is an option for forking your php, however it's not usually compiled with most installs, so you'll have to make sure you can even use it. In the event you have access to pcntl_fork() you can in fact spawn an exact copy of the current process as a child process and run code in parallel. However, It's not recommended for use in a web server environment.

 

The server is our own VPS. We can make changes if possible. How can we be sure that the server runs that function or not?

Link to comment
Share on other sites

 

 

The server is our own VPS. We can make changes if possible. How can we be sure that the server runs that function or not?

 

As was already said, you shouldn't use pcntl_fork within a web environment.

 

 

 

Is this a new library that needs to be added to PHP?

 

It is a framework written in PHP for event driven, non blocking I/O with PHP. It's modeled in part on node.js.

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.