Do you have a link to the site you're sending the pingback too? You have to. Although you can just cloak the link them, usually.
Anyhow here's my code to do it without IXR. It's way faster, if I remember right. I know my folder has an older IXR version, so I must've rewritten it for SOME reason.

send_pingbacks.php:
<?php
send_pingback($domain, $responder, $target, $link);
function send_pingback($domain, $responder, $source, $target) {
$source = htmlspecialchars($source, ENT_NOQUOTES);
$target = htmlspecialchars($target, ENT_NOQUOTES);
$body = <<<EOT
<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>pingback.ping</methodName>
<params>
<param>
<value>$source</value>
<name>sourceURI</name>
</param>
<param>
<value>$target</value>
<name>targetURI</name>
</param>
</params>
</methodCall>
EOT;
# Using the cURL extension to send it off,
# first creating a custom header block
//$header[] = "Host: $domain";
$header[] = "Content-type: text/xml";
$header[] = "Content-length: ".strlen($body) . "\r\n";
$header[] = $body;
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $responder); # URL to post to
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); # return into a variable
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 25);
curl_setopt( $ch, CURLOPT_HTTPHEADER, $header ); # custom headers, see above
curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'POST' ); # This POST is special, and uses its specified Content-type
$result = curl_exec( $ch ); # run!
curl_close($ch);
print_r($header);
echo $result;
}
?>