Jump to content

Recommended Posts

Hey all

 

I am a self-taught AS3/Flex/AIR developer and I have built a system of touchscreen-kiosks running on AIR with remote content managment from an online Flex app.

 

This is the first time I have done server side stuff, so feel free to correct my question if needed.

 

Both the AIR apps and the Flex app connect to a mysql database for simple CRUD operations using php scripts and the Zend framework. The kiosks call the server every 30 seconds to update.

 

All these simple server side php scripts were auto-generated by Flash Builder's data wizard. I did the simple adjusments (gateway.php, config.ini, mysqli connection parameters) and deployed everything to the client's server. This is a a shared-server type.

 

Now, the system works. But it works slowly. Each create/read/update/delete operation works but I think it should be a lot faster.

Also, these operations put a lot of load on the server's cpu.

According to the hosting guys, this system opens 6 php-cgi proccesses that take up 40% of the server cpu power, and by doing so slows itself down and other sites hosted on that server.

 

My questions are:

 

First of all, is there a problem to begin with or is this performance expexted from the Zend framework?

Are the auto-generated scripts written by Flash Builder poorly written and can be optimized?

Can this kind of system stay on a shared-hosted-server? Should we move to a VPS server for better performance?

Is it posiible that if the tables I created on the mysql database with phpmyadmin weren't optimiatlly built that it would have this kind of impact on performance?

 

I don't know php or mysql.

Any kind of help will be much appriciated.

 

Saar

 

Here is the script written by Flash Builder: I havn't added anything - just changed the connection parameters.

 

 

<?php

 

class KiosksService {

 

var $username = "--------";

var $password = "--------";

var $server = "--------";

var $port = "3306";

var $databasename = "--------";

var $tablename = "kiosks";

 

var $connection;

 

/**

* The constructor initializes the connection to database. Everytime a request is

* received by Zend AMF, an instance of the service class is created and then the

* requested method is invoked.

*/

public function __construct() {

$this->connection = mysqli_connect(

$this->server,

$this->username,

$this->password,

$this->databasename,

$this->port

);

 

$this->throwExceptiononerror($this->connection);

}

 

/**

* Returns all the rows from the table.

*

* Add authroization or any logical checks for secure access to your data

*

* @return array

*/

public function getAllKiosks() {

 

$stmt = mysqli_prepare($this->connection, "SELECT * FROM $this->tablename");

$this->throwExceptiononerror();

mysqli_stmt_execute($stmt);

$this->throwExceptiononerror();

$rows = array();

mysqli_stmt_bind_result($stmt, $row->KioskID, $row->Station, $row->Branch, $row->Chain, $row->Pingdate, $row->Layout, $row->Online, $row->Clips, $row->Extra);

while (mysqli_stmt_fetch($stmt)) {

$row->Pingdate = new DateTime($row->Pingdate);

$rows[] = $row;

$row = new stdClass();

mysqli_stmt_bind_result($stmt, $row->KioskID, $row->Station, $row->Branch, $row->Chain, $row->Pingdate, $row->Layout, $row->Online, $row->Clips, $row->Extra);

}

mysqli_stmt_free_result($stmt);

mysqli_close($this->connection);

return $rows;

}

 

/**

* Returns the item corresponding to the value specified for the primary key.

*

* Add authorization or any logical checks for secure access to your data

*

*

* @return stdClass

*/

public function getKiosksByID($itemID) {

$stmt = mysqli_prepare($this->connection, "SELECT * FROM $this->tablename where KioskID=?");

$this->throwExceptiononerror();

mysqli_stmt_bind_param($stmt, 'i', $itemID);

$this->throwExceptiononerror();

mysqli_stmt_execute($stmt);

$this->throwExceptiononerror();

mysqli_stmt_bind_result($stmt, $row->KioskID, $row->Station, $row->Branch, $row->Chain, $row->Pingdate, $row->Layout, $row->Online, $row->Clips, $row->Extra);

if(mysqli_stmt_fetch($stmt)) {

$row->Pingdate = new DateTime($row->Pingdate);

return $row;

} else {

return null;

}

}

 

/**

* Returns the item corresponding to the value specified for the primary key.

*

* Add authorization or any logical checks for secure access to your data

*

*

* @return stdClass

*/

public function createKiosks($item) {

 

$stmt = mysqli_prepare($this->connection, "INSERT INTO $this->tablename (Station, Branch, Chain, Pingdate, Layout, Online, Clips, Extra) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");

$this->throwExceptiononerror();

 

mysqli_stmt_bind_param($stmt, 'sssssisi', $item->Station, $item->Branch, $item->Chain, $item->Pingdate->toString('YYYY-MM-dd HH:mm:ss'), $item->Layout, $item->Online, $item->Clips, $item->Extra);

$this->throwExceptiononerror();

 

mysqli_stmt_execute($stmt);

$this->throwExceptiononerror();

 

$autoid = mysqli_stmt_insert_id($stmt);

 

mysqli_stmt_free_result($stmt);

mysqli_close($this->connection);

 

return $autoid;

}

 

/**

* Updates the passed item in the table.

*

* Add authorization or any logical checks for secure access to your data

*

* @param stdClass $item

* @return void

*/

public function updateKiosks($item) {

$stmt = mysqli_prepare($this->connection, "UPDATE $this->tablename SET Station=?, Branch=?, Chain=?, Pingdate=?, Layout=?, Online=?, Clips=?, Extra=? WHERE KioskID=?");

$this->throwExceptiononerror();

mysqli_stmt_bind_param($stmt, 'sssssisii', $item->Station, $item->Branch, $item->Chain, $item->Pingdate->toString('YYYY-MM-dd HH:mm:ss'), $item->Layout, $item->Online, $item->Clips, $item->Extra, $item->KioskID);

$this->throwExceptiononerror();

 

mysqli_stmt_execute($stmt);

$this->throwExceptiononerror();

mysqli_stmt_free_result($stmt);

mysqli_close($this->connection);

}

 

/**

* Deletes the item corresponding to the passed primary key value from

* the table.

*

* Add authorization or any logical checks for secure access to your data

*

*

* @return void

*/

public function deleteKiosks($itemID) {

$stmt = mysqli_prepare($this->connection, "DELETE FROM $this->tablename WHERE KioskID = ?");

$this->throwExceptiononerror();

mysqli_stmt_bind_param($stmt, 'i', $itemID);

mysqli_stmt_execute($stmt);

$this->throwExceptiononerror();

mysqli_stmt_free_result($stmt);

mysqli_close($this->connection);

}

 

 

/**

* Returns the number of rows in the table.

*

* Add authorization or any logical checks for secure access to your data

*

*

*/

public function count() {

$stmt = mysqli_prepare($this->connection, "SELECT COUNT(*) AS COUNT FROM $this->tablename");

$this->throwExceptiononerror();

 

mysqli_stmt_execute($stmt);

$this->throwExceptiononerror();

mysqli_stmt_bind_result($stmt, $rec_count);

$this->throwExceptiononerror();

mysqli_stmt_fetch($stmt);

$this->throwExceptiononerror();

mysqli_stmt_free_result($stmt);

mysqli_close($this->connection);

return $rec_count;

}

 

 

/**

* Returns $numItems rows starting from the $startIndex row from the

* table.

*

* Add authorization or any logical checks for secure access to your data

*

*

*

* @return array

*/

public function getKiosks_paged($startIndex, $numItems) {

$stmt = mysqli_prepare($this->connection, "SELECT * FROM $this->tablename LIMIT ?, ?");

$this->throwExceptiononerror();

mysqli_stmt_bind_param($stmt, 'ii', $startIndex, $numItems);

mysqli_stmt_execute($stmt);

$this->throwExceptiononerror();

$rows = array();

mysqli_stmt_bind_result($stmt, $row->KioskID, $row->Station, $row->Branch, $row->Chain, $row->Pingdate, $row->Layout, $row->Online, $row->Clips, $row->Extra);

while (mysqli_stmt_fetch($stmt)) {

$row->Pingdate = new DateTime($row->Pingdate);

$rows[] = $row;

$row = new stdClass();

mysqli_stmt_bind_result($stmt, $row->KioskID, $row->Station, $row->Branch, $row->Chain, $row->Pingdate, $row->Layout, $row->Online, $row->Clips, $row->Extra);

}

mysqli_stmt_free_result($stmt);

mysqli_close($this->connection);

return $rows;

}

/**

* Utility function to throw an exception if an error occurs

* while running a mysql command.

*/

private function throwExceptiononerror($link = null) {

if($link == null) {

$link = $this->connection;

}

if(mysqli_error($link)) {

$msg = mysqli_errno($link) . ": " . mysqli_error($link);

throw new Exception('MySQL Error - '. $msg);

}

}

}

 

?>

Please use the [code][/code] tags around your code, as it helps make both your post and your code a lot easier to read. Also, please don't mess around with the colours, especially not dark green and bold; It made your code virtually impossible to read.

 

As for your performance question: That's actually somewhere between hard and impossible to answer, at least without profiling the code properly. There could be any number of things that causes the slow down, everything from a badly constructed SQL query, missing indices in the DB, slow file system, slow HTTP request, to problems in your code caused by any number of issues that leads to poor performance.

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.