CakePHP query | Newbie | | Join Date: May 2009
Posts: 2
| |
Hi all,
I am using CakePHP to develop a bidding site. I have created a controller called 'daemons' and it performs 4 different tasks which I need to run continuously on the server every minute. I have set this up as 4 cron jobs but something is not working right and my crons just fail to work!
Could be a problem with the controller, just not able to place it. My controller code is pasted below: - <?php
-
class DaemonsController extends AppController {
-
-
var $name = 'Daemons';
-
-
var $uses = array('Auction', 'Setting');
-
-
function beforeFilter(){
-
$email='abc@gmail.com';
-
$secondemail='no-reply@xyz.com';
-
$mess='It works';
-
//@mail($email, 'Test', $mess, "From: ".$secondemail);
-
-
parent::beforeFilter();
-
-
if(!empty($this->Auth)) {
-
$this->Auth->allow('bidbutler', 'extend', 'autobid', 'close');
-
}
-
ini_set('max_execution_time', ($this->appConfigurations['cronTime'] * 60) + 1);
-
}
-
-
/**
-
* The function makes the bid butler magic happen
-
*
-
* @return array Affected Auction
-
*/
-
function bidbutler() {
-
-
$this->layout = 'js/ajax';
-
-
$data = array();
-
$setting = array();
-
$auctions = array();
-
-
// Get the bid butler time
-
$bidButlerTime = $this->Setting->get('bid_butler_time');
-
-
// Get various settings needed
-
$data['bid_debit'] = $this->Setting->get('bid_debit');
-
$data['auction_price_increment'] = $this->Setting->get('auction_price_increment');
-
$data['auction_time_increment'] = $this->Setting->get('auction_time_increment');
-
$data['auction_peak_start'] = $this->Setting->get('auction_peak_start');
-
$data['auction_peak_end'] = $this->Setting->get('auction_peak_end');
-
-
$expireTime = time() + ($this->appConfigurations['cronTime'] * 60);
-
-
while (time() < $expireTime) {
-
// Formating the conditions
-
$conditions = array(
-
'Auction.end_time < \''. date('Y-m-d H:i:s', time() + $bidButlerTime). '\'',
-
'Auction.closed' => 0,
-
'Bidbutler.bids >' => 0
-
);
-
-
// Find the bidbutler entry - we get them from the lowest price to the maximum price so that they all run!
-
$this->Auction->Bidbutler->contain('Auction');
-
$bidbutlers = $this->Auction->Bidbutler->find('all', array('conditions' => $conditions, 'order' => 'rand()', 'fields' => array('Auction.id', 'Auction.start_price', 'Bidbutler.id', 'Bidbutler.minimum_price', 'Bidbutler.maximum_price', 'Bidbutler.user_id'), 'contain' => 'Auction'));
-
-
if(!empty($bidbutlers)) {
-
// Walk through bidbutler entries
-
foreach($bidbutlers as $bidbutler) {
-
if($bidbutler['Bidbutler']['minimum_price'] >= $bidbutler['Auction']['start_price'] &&
-
$bidbutler['Bidbutler']['maximum_price'] < $bidbutler['Auction']['start_price']) {
-
-
// Add more information
-
$data['auction_id'] = $bidbutler['Auction']['id'];
-
$data['user_id'] = $bidbutler['Bidbutler']['user_id'];
-
$data['bid_butler'] = $bidbutler['Bidbutler']['id'];
-
-
// Bid the auction
-
$result = $this->Auction->bid($data);
-
}
-
}
-
}
-
usleep(900000);
-
}
-
}
-
-
/**
-
* The function auto extends auctions and bids for an auto bid if neccessary
-
*
-
* @return array Affected Auction
-
*/
-
function extend() {
-
$this->layout = 'js/ajax';
-
-
$data = array();
-
$setting = array();
-
$auctions = array();
-
-
$data['bid_debit'] = $this->Setting->get('bid_debit');
-
$data['auction_price_increment'] = $this->Setting->get('auction_price_increment');
-
$data['auction_time_increment'] = $this->Setting->get('auction_time_increment');
-
$data['auction_peak_start'] = $this->Setting->get('auction_peak_start');
-
$data['auction_peak_end'] = $this->Setting->get('auction_peak_end');
-
-
$data['isPeakNow'] = $this->isPeakNow();
-
-
$expireTime = time() + ($this->appConfigurations['cronTime'] * 60);
-
-
while (time() < $expireTime) {
-
// now check for auto extends
-
$auctions = Cache::read('daemons_extend_auctions');
-
if(empty($auctions)) {
-
$auctions = $this->Auction->find('all', array('contain' => '', 'conditions' => "(Auction.extend_enabled = 1 OR Auction.autobid = 1) AND (Auction.start_price < Auction.minimum_price) AND Auction.winner_id = 0 AND Auction.closed = 0"));
-
Cache::write('daemons_extend_auctions', $auctions, '+1 day');
-
}
-
-
if(!empty($auctions)) {
-
foreach($auctions as $auction) {
-
// lets see if we need to extend the auction
-
$endTime = strtotime($auction['Auction']['end_time']);
-
$extendTime = time() + ($auction['Auction']['time_before_extend']);
-
-
if($extendTime > $endTime) {
-
// lets see if autobid is enabled
-
// autobid will place a bid by a robot if another user is the highest bidder but hasn't meet the minimum price
-
if($auction['Auction']['autobid'] == 1) {
-
if($auction['Auction']['extend_enabled'] == 1) {
-
// lets only bid if the limit is less than te autobid limit when the autobid limit is set
-
if($auction['Auction']['autobid_limit'] > 0) {
-
if($auction['Auction']['current_limit'] <= $auction['Auction']['autobid_limit']) {
-
$this->Auction->Autobid->check($auction['Auction']['id'], $auction['Auction']['end_time'], $data);
-
}
-
} else {
-
$this->Auction->Autobid->check($auction['Auction']['id'], $auction['Auction']['end_time'], $data);
-
}
-
} else {
-
$bid = $this->Auction->Bid->lastBid($auction['Auction']['id']);
-
// lets set the autobid
-
if(!empty($bid) && ($bid['autobidder'] == 0)) {
-
$this->Auction->Autobid->check($auction['Auction']['id'], $auction['Auction']['end_time'], $data);
-
}
-
}
-
} elseif($auction['Auction']['extend_enabled'] == 1) {
-
unset($auction['Auction']['modified']);
-
$auction['Auction']['end_time'] = date('Y-m-d H:i:s', $endTime + ($auction['Auction']['time_extended']));
-
-
// lets do a quick check to make sure the new end time isn't less than the current time
-
$newEndTime = strtotime($auction['Auction']['end_time']);
-
if($newEndTime < time()) {
-
$auction['Auction']['end_time'] = date('Y-m-d H:i:s', time() + ($auction['Auction']['time_extended']));
-
}
-
-
$this->Auction->save($auction);
-
}
-
}
-
}
-
}
-
usleep(800000);
-
}
-
}
-
-
/**
-
* The function auto extends auctions in the last IF the extend function fails
-
*
-
* @return array Affected Auction
-
*/
-
function autobid() {
-
$data['bid_debit'] = $this->Setting->get('bid_debit');
-
$data['auction_time_increment'] = $this->Setting->get('auction_time_increment');
-
$data['auction_price_increment'] = $this->Setting->get('auction_price_increment');
-
$data['auction_peak_start'] = $this->Setting->get('auction_peak_start');
-
$data['auction_peak_end'] = $this->Setting->get('auction_peak_end');
-
$data['isPeakNow'] = $this->isPeakNow();
-
$isPeakNow = $this->isPeakNow();
-
-
$expireTime = time() + ($this->appConfigurations['cronTime'] * 60);
-
-
while (time() < $expireTime) {
-
// lets start by getting all the auctions that have closed
-
$auctions = $this->Auction->find('all', array('fields' => array('Auction.id', 'Auction.peak_only'), 'contain' => '', 'conditions' => "Auction.winner_id = 0 AND Auction.end_time <= '" . date('Y-m-d H:i:s', time() + 4) . "' AND Auction.closed = 0"));
-
-
if(!empty($auctions)) {
-
foreach($auctions as $auction) {
-
// before we declare this user the winner, lets run some test to make sure the auction can definitely close
-
if($this->Auction->checkCanClose($auction['Auction']['id'], $isPeakNow, false) == false) {
-
// lets check to see if the reason we can't close it, is because its now offpeak and this is a peak auction
-
if($auction['Auction']['peak_only'] == 1 && !$isPeakNow) {
-
continue;
-
} else {
-
$this->Auction->Autobid->placeAutobid($auction['Auction']['id'], $data);
-
}
-
}
-
}
-
}
-
usleep(900000);
-
}
-
}
-
-
/**
-
* The function closes the auctions
-
*
-
* @return array Affected Auction
-
*/
-
function close() {
-
$expireTime = time() + ($this->appConfigurations['cronTime'] * 60);
-
-
while (time() < $expireTime) {
-
// lets start by getting all the auctions that have closed
-
$auctions = $this->Auction->find('all', array('contain' => '', 'conditions' => "Auction.winner_id = 0 AND Auction.end_time <= '" . date('Y-m-d H:i:s') . "' AND Auction.closed = 0"));
-
-
if(!empty($auctions)) {
-
foreach($auctions as $auction) {
-
$isPeakNow = $this->isPeakNow();
-
-
// before we declare this user the winner, lets run some test to make sure the auction can definitely close
-
if($this->Auction->checkCanClose($auction['Auction']['id'], $isPeakNow) == false) {
-
// lets check to see if the reason we can't close it, is because its now offpeak and this is a peak auction
-
if($auction['Auction']['peak_only'] == 1 && !$isPeakNow) {
-
$peak = $this->nonPeakDates();
-
-
//Calculate how many seconds auction will end after peak end
-
$seconds_after_peak = strtotime($auction['Auction']['end_time']) - strtotime($peak['peak_end']);
-
$end_time = strtotime($peak['peak_start']) + $seconds_after_peak;
-
-
$auction['Auction']['end_time'] = date('Y-m-d H:i:s', $end_time);
-
$this->Auction->save($auction);
-
-
} else {
-
// lets check just how far ago this auction closed, and either place an autobid or extend the time
-
$data['auction_time_increment'] = $this->Setting->get('auction_time_increment');
-
-
$newEndTime = strtotime($auction['Auction']['end_time']);
-
if($newEndTime < time() - $data['auction_time_increment']) {
-
$auction['Auction']['end_time'] = date('Y-m-d H:i:s', time() + ($auction['Auction']['time_extended']));
-
$this->Auction->save($auction);
-
} else {
-
//lets extend it by placing an autobid
-
$data['bid_debit'] = $this->Setting->get('bid_debit');
-
$data['auction_price_increment'] = $this->Setting->get('auction_price_increment');
-
$data['auction_peak_start'] = $this->Setting->get('auction_peak_start');
-
$data['auction_peak_end'] = $this->Setting->get('auction_peak_end');
-
$data['isPeakNow'] = $this->isPeakNow();
-
-
$this->Auction->Autobid->placeAutobid($auction['Auction']['id'], $data);
-
}
-
}
-
continue;
-
}
-
-
$bid = $this->Auction->Bid->find('first', array('conditions' => array('Bid.auction_id' => $auction['Auction']['id']), 'order' => array('Bid.id' => 'desc')));
-
if(!empty($bid)) {
-
if($bid['User']['autobidder'] == 0) {
-
// send the email to the winner
-
$data['Auction'] = $auction['Auction'];
-
$data['Bid'] = $bid['Bid'];
-
$data['User'] = $bid['User'];
-
$data['to'] = $data['User']['email'];
-
$data['subject'] = sprintf(__('%s - You have won an auction', true), $this->appConfigurations['name']);
-
$data['template'] = 'auctions/won_auction';
-
$this->_sendEmail($data);
-
-
$auction['Auction']['status_id'] = 1;
-
}
-
-
$auction['Auction']['winner_id'] = $bid['Bid']['user_id'];
-
}
-
unset($auction['Auction']['modified']);
-
$auction['Auction']['closed'] = 1;
-
$this->Auction->save($auction);
-
}
-
}
-
usleep(900000);
-
}
-
}
-
}
-
?>
Anyone notice any bugs in this..?
Thanks!
|  | Moderator | | Join Date: Aug 2008 Location: Leipzig, Germany
Posts: 3,662
| | | re: CakePHP query
have you tried the code outside the cron job?
| | Newbie | | Join Date: May 2009
Posts: 2
| | | re: CakePHP query
Thanks for that reply Dormilich and sorry for responding late.
And yes, I did try the code outside the cron job, it would work.
Checked the whole function by placing a mail function in it. Mailing from the beforeFilter() function apparently worked. Seems there is some other bug in the controller which wont allow the crons to place an autobid.
Still not able to figure this out though.
|  | | | | /bytes/about
We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights.
Get the best answers to your questions from over 226,510 network members.
|